Linux下用java -jar運行可執(zhí)行jar包的方法教程
問題來源
一般來說,一個稍微大些的項目都會有一些依賴的Jar包,而在將項目部署到服務(wù)器的過程中,如果沒有持續(xù)集成環(huán)境的話,也就是說服務(wù)器不支持在線編譯及打包,那么需要自己上傳依賴的Jar包,然而可能服務(wù)器上已經(jīng)存在了該項目所依賴的Jar包(比如項目修復(fù)BUG,重新打包上傳,而依賴不變),無需再次上傳,此時只需將該項目單獨打包,在運行的時候指定CLASSPATH
即可。
在將Jar包部署到服務(wù)器上之后,設(shè)置CLASSPATH
環(huán)境變量,運行Java -jar ...
命令出現(xiàn)ClassNotFoundException
異常。之后又試用了諸多其它參數(shù)設(shè)置CLASSPATH
,例如下面幾個命令,同樣都是報找不到類異常。
set CLASSPATH = classpath1;classpath2... java -classpath ".;D:\mylib\*" -jar jar包 #Windows設(shè)置 java -classpath ".:/data/home/mylib/*" -jar jar包 #Linux設(shè)置 java -cp ... java -cp /lib/*
關(guān)于在CLASSPATH
參數(shù)中使用通配符需要注意
正確方式(冒號代表是Linux,Windows使用分號)
java -classpath "lib/*:." my.package.Program
不正確方式
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包分為可執(zhí)行Jar和非可執(zhí)行Jar,一個可執(zhí)行的Jar文件是一個自包含的Java應(yīng)用程序,它存儲在特別配置的JAR文件中,可以由JVM直接執(zhí)行它而無需事先提取文件或者設(shè)置類路徑。要運行存儲在非可執(zhí)行的JAR中的應(yīng)用程序,必須將它加入到您的類路徑中,并用名字調(diào)用應(yīng)用程序的主類。但是使用可執(zhí)行的JAR文件,我們可以不用提取它或者知道主要入口點就可以運行一個應(yīng)用程序??蓤?zhí)行JAR有助于方便發(fā)布和執(zhí)行Java應(yīng)用程序。
對于可執(zhí)行Jar,在運行java -jar選項的時候,那么環(huán)境變量CLASSPATH
和在命令行中指定的所有類路徑都將被JVM忽略,也就是說,對于一個可執(zhí)行Jar,使用java -classpath
或者java -cp
或者set classpath=lib/commons-io-2.4.jar
等等命令指定CLASSPATH
都是無效的。
對于一個可執(zhí)行的JAR必須通過MANIFEST.MF文件的頭引用它所需要的所有其他從屬JAR,引用方式如下
Class-Path: lib/commons-io-2.4.jar lib/commons-lang3-3.4.jar
如果有多個Jar包那么相互之間使用空格分隔。MANIFEST
文件的一般格式如下
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
其中Manifest-Version
表示版本號,一般由IDE工具自動生成,在編寫MANIFEST文件的過程中,有如下注意點
Main-Class
是jar文件的主類,程序的入口Class-Path
指定需要的jar,多個jar必須要在一行上,多個jar之間以空格隔開,如果引用的jar在當(dāng)前目錄的子目錄下,windows下使用\來分割,linux下用/分割- 文件的冒號后面必須要空一個空格,否則會出錯
- 文件的最后一行必須是一個回車換行符,否則也會出錯
多條java jar命令的執(zhí)行順序問題
通常情況下,我們會在服務(wù)器上配置shell腳本去定時調(diào)用自己的Jar包,但是當(dāng)shell腳本中存在多條java -jar
命令時,其執(zhí)行情況是怎么樣的呢?是同時并行執(zhí)行,還是挨個按順序執(zhí)行呢?經(jīng)過測試得出,多條java -jar命令是按順序執(zhí)行的,并且只有在第一條java -jar
命令執(zhí)行完畢后,才會執(zhí)行下一條java -jar
命令,依次類推。
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
從0開始學(xué)習(xí)大數(shù)據(jù)之java spark編程入門與項目實踐
這篇文章主要介紹了從0開始學(xué)習(xí)大數(shù)據(jù)之java spark編程入門與項目實踐,結(jié)合具體入門項目分析了大數(shù)據(jù)java spark編程項目建立、調(diào)試、輸出等相關(guān)步驟及操作技巧,需要的朋友可以參考下2019-11-11Spring?Boot?利用?XML?方式整合?MyBatis
這篇文章主要介紹了Spring?Boot?利用?XML?方式整合?MyBatis,文章圍繞主題的相關(guān)資料展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,組要的小伙伴可以參考一下2022-05-05SpringBoot左腳進(jìn)門之Maven管理家具體步驟
Maven 是一個項目管理和整合工具,通過對 目錄結(jié)構(gòu)和構(gòu)建生命周期 的標(biāo)準(zhǔn)化, 使開發(fā)團(tuán)隊用極少的時間就能夠自動完成工程的基礎(chǔ)構(gòu)建配置,本文介紹SpringBoot左腳進(jìn)門之Maven管理家具體步驟,感興趣的朋友一起看看吧2024-12-12Springboot通過谷歌Kaptcha?組件生成圖形驗證碼功能
Kaptcha是谷歌開源的一款簡單實用的圖形驗證碼組件。我個人推薦它的最大原因是容易上手,采用約定大于配置的方式,快速契合到項目中,這篇文章主要介紹了Springboot通過谷歌Kaptcha組件生成圖形驗證碼的方法,需要的朋友可以參考下2023-05-05