7

我想将外部 jar 包含到我的 java 项目中。我正在使用蚂蚁。外部 .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:package com.something does not exist.. 我应该编辑什么才能使其正常工作?

确切的错误:

  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
4

4 回答 4

4

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

<fileset dir="lib" />

在 jar 部分中,您包含如下类:

<zipgroupfileset includes="*.jar" dir="lib"/>
于 2012-04-15T18:37:14.527 回答
1

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

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

这一点来自一个罐子的背景信息

不幸的是,这是行不通的。Java Launcher$AppClassLoader 不知道如何使用这种 Class-Path 从 Jar 中的 Jar 中加载类。尝试使用 jar:file:jarname.jar!/commons-logging.jar 也会导致死胡同。这种方法只有在您将支持的 Jar 文件安装(即分散)到安装 jarname.jar 文件的目录中时才有效。

另一种方法是解压缩所有依赖的 Jar 文件并将它们重新打包到 jarname.jar 文件中。这种方法往往脆弱且缓慢,并且可能会遇到重复资源问题。

其他选择:

  • jarjar : Jar Jar Links 是一个实用程序,可以轻松重新打包 Java 库并将它们嵌入到您自己的发行版中
于 2012-04-16T06:16:45.540 回答
0

我还使用 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>
于 2012-04-16T04:01:33.240 回答
0

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

        <unzip src="/Developer-Java/mysql-connector-java/mysql-connector-java-5.1.22-bin.jar" dest="${build_dir}" />
于 2013-01-09T07:07:22.897 回答