如何创建在动态位置使用外部jar文件的可运行jar

时间:2010-01-19 14:48:51

标签: java ant build-process classpath manifest.mf

我编写了一个大约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

5 个答案:

答案 0 :(得分:3)

只需将CLASSPATH环境变量设置为指向.jar即可 或者将-classpath选项传递给java。

以下是如何操作under windows

答案 1 :(得分:3)

注意不能同时使用-cp和-jar。当您执行java -jar时,java期望在MANIFEST.MF文件中声明引用的jar。我认为你的命令行应该把你的jar放在“cp”里面,并在命令行上明确地调用主类。

如果您担心尺寸,另一个解决方案是使用JNLP部署您的应用程序并使用Pack200压缩您的jar。

答案 2 :(得分:2)

您可以使用Java Web Start启动您的应用程序吗?这将允许您在安装时外部化您的依赖项。

答案 3 :(得分:0)

  

希望库文件的路径可以由系统环境变量定义。

这不是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将其包含在类路径中。

答案 4 :(得分:0)

如果使用-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变量...