Linux下使用java -jar运行可执行jar包的正确方式
2017-03-14 10:59
483 查看
问题来源
一般来说,一个稍微大些的项目都会有一些依赖的Jar包,而在将项目部署到服务器的过程中,如果没有持续集成环境的话,也就是说服务器不支持在线编译及打包,那么需要自己上传依赖的Jar包,然而可能服务器上已经存在了该项目所依赖的Jar包(比如项目修复BUG,重新打包上传,而依赖不变),无需再次上传,此时只需将该项目单独打包,在运行的时候指定CLASSPATH即可。在将Jar包部署到服务器上之后,设置CLASSPATH环境变量,运行
java -jar ...命令出现ClassNotFoundException异常。之后又试用了诸多其它参数设置CLASSPATH,例如下面几个命令,同样都是报找不到类异常。
1 | set CLASSPATH = classpath1;classpath2... java -classpath ".;D:\mylib\*" -jar jar包 #Windows设置 java -classpath ".:/data/home/mylib/*" -jar jar包 #Linux设置 java -cp ... java -cp /lib/* |
正确方式(冒号代表是Linux,Windows使用分号)
1 | java -classpath "lib/*:." my.package.Program |
1 | java -classpath "lib/a*.jar:." my.package.Program java -classpath "lib/a*:." my.package.Program java -classpath "lib/*.jar:." my.package.Program java -classpath lib/*:. my.package.Program |
解决办法
首先你需要知道Jar包分为可执行Jar和非可执行Jar,一个可执行的Jar文件是一个自包含的Java应用程序,它存储在特别配置的JAR文件中,可以由JVM直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行的JAR中的应用程序,必须将它加入到您的类路径中,并用名字调用应用程序的主类。但是使用可执行的JAR文件,我们可以不用提取它或者知道主要入口点就可以运行一个应用程序。可执行JAR有助于方便发布和执行Java应用程序。对于可执行Jar,在运行java -jar选项的时候,那么环境变量CLASSPATH和在命令行中指定的所有类路径都将被JVM忽略,也就是说,对于一个可执行Jar,使用java -classpath或者java -cp或者set classpath=lib/commons-io-2.4.jar等等命令指定CLASSPATH都是无效的。
对于一个可执行的JAR必须通过MANIFEST.MF文件的头引用它所需要的所有其他从属JAR,引用方式如下
1 | Class-Path: lib/commons-io-2.4.jar lib/commons-lang3-3.4.jar |
12 | Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Built-By: wangxu X-Compile-Target-JDK: 1.7 X-Compile-Source-JDK: 1.7 Created-By: Apache Maven 3.3.3 Build-Jdk: 1.8.0_45 Main-Class: com.yuewen.statistics.report.service.Main Class-Path: lib/commons-io-2.4.jar lib/commons-lang3-3.4.jar lib/guava-18.0.jar lib/junit-4.10.jar lib/log4j-api-2.0.jar lib/log4j-core-2.0.jar lib/lombok-1.16.4.jar lib/lucene-analyzers-common-5.5.0.jar lib/lucene-analyzers-smartcn-5.5.0.jar lib/lucene-core-5.5.0.jar lib/lucene-grouping-5.5.0.jar lib/lucene-queries-5.5.0.jar lib/lucene-queryparser-5.5.0.jar lib/mysql-connector-java-5.1.38-bin.jar |
Main-Class是jar文件的主类,程序的入口
Class-Path指定需要的jar,多个jar必须要在一行上,多个jar之间以空格隔开,如果引用的jar在当前目录的子目录下,windows下使用\来分割,linux下用/分割
文件的冒号后面必须要空一个空格,否则会出错
文件的最后一行必须是一个回车换行符,否则也会出错
多条java jar命令的执行顺序问题
通常情况下,我们会在服务器上配置shell脚本去定时调用自己的Jar包,但是当shell脚本中存在多条java -jar命令时,其执行情况是怎么样的呢?是同时并行执行,还是挨个按顺序执行呢?经过测试得出,多条
java -jar命令是按顺序执行的,并且只有在第一条
java -jar命令执行完毕后,才会执行下一条
java -jar命令,依次类推。
参考资料
【1】http://stackoverflow.com/questions/219585/setting-multiple-jars-in-java-classpath/219801#219801
【2】https://www.ibm.com/developerworks/cn/java/j-jar/
原文链接:http://codepub.cn/2016/05/11/The-correct-way-to-use-java-jar-run-an-executable-jar-package-under-Linux/
相关文章推荐
- Linux下使用java -jar运行可执行jar包的正确方式
- 转: Linux下使用java -jar运行可执行jar包的正确方式
- java 将应用程序打成可执行的JAR包,然后使用批处理方式运行
- java 将应用程序打成可执行的JAR包,然后使用批处理方式运行
- teamcity执行jmeter脚本使用Executable with parameters方式不能正确运行解决思路
- Dubbo服务的运行方式(使用maven构建dubbo可执行的jar包)
- 获得执行jar的运行路径-使用java.class.path 和 codesource的location
- 获得执行jar的运行路径-使用java.class.path 和 codesource的location
- 在命令提示符下编译、运行java 以及使用jar命令制作可执行的jar包
- Linux下用java -jar运行可执行jar包的方法教程
- java命令执行jar包(里面的main函数,无web.xml文件)的方式(包括依赖其它的jar包),使用Google-Guava Concurrent包里的Service框架,maven工程
- Java项目导出为可执行jar包,并在windows/linux下运行
- java中的jar打包成可执行文件,可以避免在linux中的java程序运行时内存剧增现象
- linux使用 java -jar来运行java非web程序
- java命令执行jar包的方式
- 使用脚本引擎增加程序运行时动态执行能力(Java篇)
- Linux(Red Hat5)下使用crontab定时执行java程序
- java 使用jsch 远程链接linux执行命令
- Java项目导出为jar包,并在windows/linux下运行
- java Windows下cmd 命令和Linux下shell命令 执行非JDK中的jar包