繁体   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