如何从可执行jar中引用tools.jar

时间:2010-08-13 03:54:16

标签: java

说我这样做:

java -jar someJar

“someJar”需要引用tools.jar(用于jsp编译)。我不想在someJar中捆绑tools.jar,因为我担心与执行的JVM不兼容。我无法指定-classpath,因为在使用-jar时会忽略它。我试过-Djava.ext.dirs但是没用。有没有人知道如何从可执行jar中引用tools.jar?

3 个答案:

答案 0 :(得分:3)

从Java 1.4开始,tools.jar needs to be included in the user classpath

  

工具类现在位于   单独存档(tools.jar)并且可以   仅在包含在用户中时使用   类路径(稍后会解释)。

换句话说,tools.jar不能放在扩展目录中。这实际上意味着在JAR的清单中指定它可能根本不是一个好主意。但是有几种选择:

  1. 使用CLASSPATH变量或-cp选项指定tools.jar。如果您在JAR中有一个主类,这可以使用java -cp $JDK_HOME/lib/tools.jar MainClass命令进行初始化,其中MainClass是该类的完全限定名称。
  2. 使用加载tools.jar的自定义类加载器,前提是您知道JDK主目录的位置。使用JRE会使事情变得困难,因为您将被迫请求用户指定JDK的位置。可以使用System.getProperty调用通过java.home属性确定JDK的位置。

答案 1 :(得分:0)

-jar选项优先于-classpath选项。但是,您可以在正在执行的jar的清单文件中包含类路径引用。有一个名为“Class-Path”的属性,它可以包含对其他jar的相对或绝对引用

这是一个片段,向您展示如何

<target name="jar" depends="compile">
    <jar destfile="foo.jar" basedir="classes">
        <manifest>
            <attribute name="Main-Class" value="com.wiggle.foo" />
            <attribute name="Class-Path" 
                value="C:/Java/jdk1.5.0_21/lib/tools.jar" />
        </manifest>
    </jar>
</target>

请注意,如果要在Class-Path属性中包含多个jar,它们必须位于清单文件中的一行

答案 2 :(得分:0)

我不希望清单引用依赖于系统的位置。使用-jar时我也不能使用-classpath。我认为解决方法是使用-classpath而不是使用-jar。我不会将Main-Class放在清单中,而是将主类放在命令行上。