javar -jar 和 java -cp :命令行运行java代码
java -cp 和 javac -cp
https://www.cnblogs.com/webcyz/p/6551655.html
jvm搜索类定义过程:
1:系统会现在当前包下找。
2:会在rt.jar 文件下找
3;会在classpath所指向的路径下找。
-cp 即 -classpath 指定classpath
windows系统下多个jar用分号":"分隔
编译
javac -cp 绝对路径1.jar;绝对路径2.jar java文件名.java
运行
java -cp .;绝对路径1.jar;绝对路径2.jar 全限定类名(此类有main方法)
linux系统下多个jar用冒号":"分隔
编译
javac -cp 绝对路径1.jar:绝对路径2.jar java文件名.java
运行
java -cp .:绝对路径1.jar:绝对路径2.jar 全限定类名 (此类有main方法)
注意:多个jar包必须拼接classpath,不能使用统配符号。
java -jar
java命令执行jar包的方式
一个java应用项目可以打包成一个jar,指定一个拥有main函数的main class作为你这个jar包的程序入口。就可以用 jar -jar jar的名称.jar运行了。
指定入口的方法是修改jar包内目录META-INF下的MANIFEST.MF文件。
比如有个叫做test.jar的jar包,里面有一个拥有main函数的main class:test.someClassName
我们就只要在MANIFEST.MF里面添加如下一句话:
Main-Class: test.someClassName
然后我们可以在控制台里输入java -jar test.jar即可以运行这个jar。
但是我们这个项目需要引用其他第三方的jar包,在eclipse里面以项目jar包的形式引用了这个叫做some.jar的包,当时放在项目的lib子目录下,最后项目打包时把这个some.jar也打进来了,但是用java -jar执行这个test.jar的时候报找不到Class异常,原因就是jar引用不到放在自己内部的jar包。
那怎么办?
运行时将其加入classpath的方式行不行?就是在运行jar的同时加入classpath参数:
java -classpath some.jar -jar test.jar
这种方式是不行的,因为使用classpath指定的jar是由AppClassloader来加载,java 命令 加了-jar 参数以后,AppClassloader就只关注test.jar范围内的class了,classpath参数失效。
那该怎么引用其他的jar包呢?
方法一、使用Bootstrap Classloader来加载这些类
在运行时使用如下参数:
-Xbootclasspath:完全取代系统Java classpath.最好不用。
-Xbootclasspath/a: 在系统class加载后加载。一般用这个。
-Xbootclasspath/p: 在系统class加载前加载,注意使用,和系统类冲突就不好了.
win32 java -Xbootclasspath/a: some.jar;some2.jar; -jar test.jar
unix java -Xbootclasspath/a: some.jar:some2.jar: -jar test.jar
win32系统每个jar用分号隔开,unix系统下用冒号隔开
方法二、使用Extension Classloader来加载
把需要加载的jar都扔到%JRE_HOME%/lib/ext下面,这个目录下的jar包会在Bootstrap Classloader工作完后由Extension Classloader来加载。非常方便,非常省心。:)
方法三、还是用AppClassloader来加载,不过不需要classpath参数了
在MANIFEST.MF中添加如下代码:
Class-Path: lib/some.jar
lib是和test.jar同目录的一个子目录,test.jar要引用的some.jar包就在这里面。
如果有多个jar包需要引用的情况:
Class-Path: lib/some.jar lib/some2.jar
每个单独的jar用空格隔开就可以了。注意使用相对路径。
另:如果META-INF 下包含INDEX.LIST文件的话,可能会使Class-Path配置失效。INDEX.LIST是Jar打包工具打包时生成的索引文件,删除对运行不产生影响。
方法四、自定义Classloader来加载
这种方法是终极解决方案,基本上那些知名java应用都是那么干的,如tomcat、jboss等等。
转载于:https://www.cnblogs.com/veryvalley/p/9883087.html
javar -jar 和 java -cp :命令行运行java代码相关推荐
- JAVA 的命令行运行
作者:孙英鹏 撰写时间:2019年4月18日 JAVA 的命令行运行 今天要讲的是如何在命令行里进行打印运行.说明(此方法是老师的上课内容,我重新理解一遍) 首先创建一个文本文档,放在一个文件夹里,文 ...
- Windows命令行运行Java程序
如何在Windows命令行运行Java程序 准备工作 1.安装JDK 安装JDK(Java Development Kit Java开发工具包 又称SDK)Oracle公司JDK下载地址,直接下载,然 ...
- php 运行thinkphp,thinkPHP cli命令行运行PHP代码
下面由thinkphp教程栏目给大家介绍thinkPHP cli命令行运行PHP代码的方法,希望对需要的朋友有所帮助! 这几天在做项目的过程中,刚好需要用到 在thinkPHP中利用cli来运行 某个 ...
- jar包如何在命令行运行
jar包在命令行运行 方式一:有绑定主类(有main函数入口) java -jar xxx.jar 方式二:无需绑定主类,可自行指定 java -cp xxx.jar xxx.main.Class 如 ...
- JAVA 命令行运行java项目
多年以来 一直使用的是IDE 来写java 项目,导致很多的最基础的东西都渐渐模糊了. 最近遇到一个问题就是如果命令行来运行一个java项目 当然这不是初学的那个运行 HelloWord.java , ...
- java执行class找不到_命令行运行java的class文件提示找不到或无法加载主类
问题如下 TestOne.javapackage moon.star; public class TestOne { public void fTestOne() { System.out.print ...
- java 命令行 编译 jar文件_用命令行编译java并生成可执行的jar包
如果想用java编写一个可视化小程序,碰巧手头没有IDE的话,可以用命令行来完成编译.打包等工作. 拿自己编写的"java记事本"为例,介绍一下这个过程: 1.编写源代码. 编写源 ...
- java 程序命令_命令行运行JAVA程序
如果出现找不到变量,核查环境变量是否配置好 可以运行javac java java -version看是否正常 注意要在对应的目录下 核查java文件里边的名字 class文件名是否与java文件名一 ...
- java命令行运行 package_使用命令行运行Java程序
很久没有试过用Java命令行来运行程序了.今天用的时候都感觉有点不太顺利了.所以特别记下来,以免后边什么时候又忘掉. 首先是将编写好的Java程序放在某一文件夹下边.(本文以D盘javabasecod ...
- 怎么用命令行运行.java文件
第一步 假如在e盘里有个文件夹名为Java,在Java文件夹里有一个事先写好的.java程序,如下: 第二步 打开命令行窗口(Window+R),输入cmd,点确定,如下: 第三步 转到HelloWo ...
最新文章
- 秒过,度目智慧通行让常态化防疫更高效
- 百度贴吧——因百度账号策略调整导致长时间未登录的账号(最后登录在2017年6月1日以前)网页端无法登陆、移动端异常解决方案
- 顺序查找法,用函数实现。
- 【GIF动画+完整可运行源代码】C++实现 快速排序——十大经典排序算法之六
- 关于 mahout factorize-movielens-1M.sh 执行
- Flowable 数据库表结构 ACT_RE_DEPLOYMENT
- Springsecurity之认证过程简析
- ZOJ 1094 带括号的矩阵连乘
- Linux系统上安装JDK和Tomcat服务器
- Security+ 学习笔记32 云安全控制
- 利用Keydown事件阻止用户输入
- Dorado7自定义下拉框
- vant附带样式去除
- java前沿技术有哪些,写给正在求职的Java开发
- 软件考试(一)计算机技术与软件专业技术资格(水平)考试(以下简称软件水平考试)含金量最高,与职称挂钩。
- java.util包
- ssm实战(1)------数据库表结构
- 什么蓝牙耳机性价比高?四款高性价比蓝牙耳机推荐
- 电脑录屏怎么录?超详细的录屏教程来了
- 万象:庸人容易因欠缺自知之明而自我膨胀
热门文章
- 8. 额外的并发实用程序(Additional Concurrency Utilities)
- Prototype使用$F()函数
- 【渝粤教育】国家开放大学2018年秋季 2505T学前儿童社会教育 参考试题
- 【渝粤教育】国家开放大学2018年春季 0222-21T模拟电子电路 参考试题
- 2017北理复试机试题
- LeetCode刷题系列(三)排序
- ubuntu16.04下ROS操作系统学习笔记(五)gazebo物理仿真环境搭建、加载服务端模型数据减少报错
- c# winform 窗体间的传值
- SVN的各种符号含义,svn的星号,感叹号,问号等含义
- 最基础的Python的socket编程入门教程