簡體   English   中英

如何創建在動態位置使用外部jar文件的可運行jar

[英]How to Create a runnable jar that uses external jar files in dynamic locations

我編寫了一個大約300千字節的應用程序。 它使用的jar文件(庫)大約需要10兆字節。

這些庫jar文件在我編寫的其他應用程序中使用,因此我希望它們位於外部中心位置(含義 - 同一計算機中某些硬盤驅動器上的路徑)。 希望庫文件的路徑可以由系統環境變量定義。

我找到了解決這個問題的好方法,但找不到合適的東西。 我猜這個解決方案將包括一個ant構建,也許還包括對MANIFEST文件的一些更改。 試圖這樣做,但根據我的理解,清單文件中的類路徑不能包含任何類型的變量。

先感謝您!

編輯:與下面的善良的人討論這個。 我現在使用以下命令提示符。 仍然無法正常工作。

java -cp C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/woodstox.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/activation.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/FastInfoset.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/http.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxb-api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxb-impl.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxb-xjc.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxws-api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxws-rt.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jaxws-tools.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jsr173_api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jsr181-api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/jsr250-api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/mimepull.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/resolver.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/saaj-api.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/saaj-impl.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/stax-ex.jar;C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/streambuffer.jar;C:/Work/svn/svn55/CommonLibs/lib/ws/jsr262-ri/jmxws.jar;C:/Work/svn/svn55/CommonLibs/lib/ws/jsr262-ri/jmxws-doctool.jar;C:/Work/svn/svn55/CommonLibs/lib/ws/jsr262-ri/wiseman-core.jar -Dcom.MyCompany.log.directory=C:/Oracle/Middleware/user_projects/domains/MyCompany/servers/AdminServer/logs -Dcom.MyCompany.config.directory=C:/temp/Apache/Config -jar jmx2snmp.jar

只需將CLASSPATH環境變量設置為指向.jar即可。
或者將-classpath選項傳遞給java。

這是在windows下如何做到這一點

注意不能同時使用-cp和-jar。 當您執行java -jar時,java期望在MANIFEST.MF文件中聲明引用的jar。 我認為你的命令行應該把你的jar放在“cp”里面,並在命令行上明確地調用主類。

如果您關心大小,另一個解決方案是使用JNLP部署您的應用程序並使用Pack200壓縮您的jar。

您可以使用Java Web Start啟動您的應用程序嗎? 這將允許您在安裝時外部化您的依賴項。

希望庫文件的路徑可以由系統環境變量定義。

這不是CLASSPATH的用途嗎?

例如,我將所有相關的罐子保存在$ {HOME} /罐中。 我的.bashrc包含

CLASSPATH=$(cygpath -w $HOME/jars/log4j-1.2.15.jar)
for j in $HOME/jars/*.jar
        do
        h=$(cygpath -w $j)
        CLASSPATH=$CLASSPATH\;$h
done
export CLASSPATH

這是Windows和Cygwin,Unix會直截了當地相似(而且使用Windows內置也不得不這樣做)。 因此,如果一個應用程序需要一個jar,我只需將依賴項放入jar中,下一個shell將它包含在它的類路徑中。

如果使用-jar選項運行程序,則既不使用CLASSPATH變量也不使用-cp選項。 文件說明:

使用此選項時,JAR文件是所有用戶類的源,並忽略其他用戶類路徑設置

也就是說,類路徑必須在MANIFEST文件的Class-Path:行中給出。

而不是使用-jar選項,將JAR添加到-cp選項的CLASSPATH並使用主類名稱啟動

java -cp C:/Work/svn/svn55/CommonLibs/lib/jmx/jaxws-ri/woodstox.jar;
    ...;
    C:/Work/svn/svn55/CommonLibs/lib/ws/jsr262-ri/wiseman-core.jar;jmx2snmp.jar 
    -Dcom.MyCompany.log.directory=...
    -Dcom.MyCompany.config.directory=C:/temp/Apache/Config <package.classname>

使用這個LONG類路徑,最好使用CLASSPATH變量...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM