如何使Ant更喜欢来自链接JAR而不是JDK类的类?

时间:2009-09-07 09:31:52

标签: java ant

我正在尝试构建dom4j JAR,其中包含一个xml-apis JAR,其中包含的DOM API比最近的JDK附带的更早。

但是,即使在构建文件中源和目标编译器属性设置为1.3,即使构建路径中包含xml-apis JAR,Ant仍会尝试将dom4j编译为另一个更新的w3c API (我猜一个来自JDK安装)。

以下是相关的Ant代码:

<path id="compile.classpath">
    <fileset dir="./lib/endorsed">
        <include name="*.jar" />
    </fileset>
    <fileset dir="./lib">
        <include name="*.jar" />
    </fileset>
</path>

  <target name="compile" depends="prepare-src">
    <javac srcdir="${build.src}"
           destdir="${build.dest}"
           debug="${debug}"
           optimize="${optimize}"
           target="1.3"
           source="1.3"
           deprecation="${deprecation}"
           classpathref="compile.classpath">
    </javac>
  </target>

应该使用的JAR是在lib / endorsed中,但在编译期间不使用它。

怎么回事?

4 个答案:

答案 0 :(得分:7)

您可以修改引导类路径,并且在ANT中支持具有特定属性的引导类路径,但我认为它应该是java.endorsed.dirs属性(在原始javac中):

javac -Djava.endorsed.dirs=/some/path/lib/endorsed ...

或使用compilerarg ANT子元素:

<target name="compile" depends="prepare-src">
    <javac srcdir="${build.src}"
       destdir="${build.dest}"
       debug="${debug}"
       optimize="${optimize}"
       target="1.3"
       source="1.3"
       deprecation="${deprecation}"
       classpathref="compile.classpath">
    <compilerarg value="-Djava.endorsed.dirs=/some/path/lib/endorsed"/>
</javac>

您不应将endorsed目录添加到类路径中作为引导类路径,并且在类路径之前检查任何已签名的目录以解析所需类型。这意味着将首先找到JDK的新DOM实现。

答案 1 :(得分:0)

您可以尝试排除旧的lib。

<path id="compile.classpath">    
    <fileset dir="./lib">
        <include name="*.jar" />
        <exclude name="dom4j.jar" />
    </fileset>
    <fileset dir="./lib/endorsed">
        <include name="*.jar" />
    </fileset>
</path>
<target name="compile" depends="prepare-src">
    <javac srcdir="${build.src}"
           destdir="${build.dest}"
           debug="${debug}"
           optimize="${optimize}"
           target="1.3"
           source="1.3"
           deprecation="${deprecation}"
           classpathref="compile.classpath">
    </javac>
  </target>

答案 2 :(得分:0)

使用bootclasspath / bootclasspathref属性。

答案 3 :(得分:0)

仅供参考,这可以使用像这样的maven来实现,

<plugins>
    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
            <source>1.6</source>
            <target>1.6</target>
            <compilerArguments>
                <endorseddirs>${endorsed.dir}</endorseddirs>
            </compilerArguments>
        </configuration>
    </plugin>
</plugins>