【问题标题】:Ant include external .jarAnt 包含外部 .jar
【发布时间】:2015-03-20 00:10:06
【问题描述】:

我想在我的 java 项目中包含外部 jar。我正在使用蚂蚁。外部 .jar 在文件夹 lib 中。我的 build.xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<project>
    <path id="classpath">
        <fileset dir="lib" includes="**/*.jar"/>
    </path>

    <target name="clean">
        <delete dir="build"/>
    </target>

    <target name="compile">
        <mkdir dir="build"/>
        <javac srcdir="src" destdir="build" classpathref="classpath" />
    </target>

    <target name="jar">
        <mkdir dir="trash"/>
        <jar destfile="trash/test.jar" basedir="build">
            <zipgroupfileset dir="lib" includes="**/*.jar"/>
            <manifest>
                <attribute name="Main-Class" value="com.Test"/>
            </manifest>
        </jar>
    </target>

    <target name="run">
        <java jar="trash/test.jar" fork="true"/>
    </target>
</project>

但它不起作用。当我想从外部 .jar 导入某些内容时,命令ant compile 后出现错误:包 com.something 不存在。我应该编辑什么才能使其正常工作?

确切的错误:

  Compiling 23 source files to xy/build
  xy/src/com/Test.java:5: package com.thoughtworks.xstream does not exist
  import com.thoughtworks.xstream.*;
  ^
  1 error

【问题讨论】:

  • 您能否编辑您的问题以向我们提供确切的错误?
  • 我已经添加了确切的错误。
  • 您不能在普通的 jar 中轻松包含外部库。你需要像一个罐子这样的特殊任务来完成它。

标签: java ant jar build.xml


【解决方案1】:

您应该尝试不使用包含属性:

<fileset dir="lib" />

在 jar 部分中,您包含这样的类:

<zipgroupfileset includes="*.jar" dir="lib"/>

【讨论】:

    【解决方案2】:

    您不能将外部库放入 jar 中并期望类加载器使用这些 jar。不幸的是,这不受支持。

    有像 one jar 这样的 ant 任务可以帮助您创建一个 jar 文件,其中包含您需要的所有内容。

    此位来自background information of one jar:

    不幸的是,这是行不通的。 Java 启动器$AppClassLoader 不知道如何使用这个从 Jar 中的 Jar 加载类 一种类路径。尝试使用 jar:file:jarname.jar!/commons-logging.jar 也导致了死胡同。 这种方法只有在您安装(即分散) 支持jar文件到jarname.jar文件所在目录 已安装。

    另一种方法是解压所有依赖的Jar文件并重新打包 在 jarname.jar 文件中。这种方法往往是脆弱的 速度慢,并且可能会出现重复资源问题。

    其他选择:

    • jarjar: Jar Jar Links 是一个实用程序,可以轻松重新打包 Java 库并将它们嵌入到您自己的发行版中

    【讨论】:

    • 不太准确,例如 Hadoop 等一些应用程序支持将 jars 放在 jar 的 lib 目录中的约定,应用程序处理将它们放在类路径中。
    • @DavidParks 但那是因为 Hadoop 使用自己的类加载器。所以这是特定于应用程序的,而不是官方 jar 定义的一部分。
    【解决方案3】:

    我还使用 ant 在我的 JAR 中包含许多依赖项 JAR。我的编译任务如下所示。也许类似的东西对你有用。

    <target name="compile" depends="init">
       <javac srcdir="${src}" destdir="${build}" includeantruntime="false">
        <classpath>
          <pathelement path="${classpath}" />
          <fileset dir="${deps}">
             <include name="**/*.jar"/>
          </fileset>
        </classpath>
      </javac>
      <copy todir="${build}">
        <fileset dir="${src}" excludes="**/*.java"/>
      </copy>
    </target>
    

    【讨论】:

      【解决方案4】:

      有时你可以直接使用jar内容,只需解压

              <unzip src="/Developer-Java/mysql-connector-java/mysql-connector-java-5.1.22-bin.jar" dest="${build_dir}" />
      

      【讨论】:

        猜你喜欢
        • 2013-11-07
        • 2016-11-29
        • 2011-04-15
        • 1970-01-01
        • 2011-02-24
        • 1970-01-01
        • 2011-09-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多