我想在我的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
答案 0 :(得分:4)
您应该尝试不使用includes属性:
<fileset dir="lib" />
在jar部分你包括这样的类:
<zipgroupfileset includes="*.jar" dir="lib"/>
答案 1 :(得分:1)
您不能将外部库放入jar中,并期望类加载器使用这些jar。不幸的是,这不受支持。
像one jar这样的ant任务可以帮助您创建一个包含所需内容的jar文件。
此位来自background information of one jar:
不幸的是,这不起作用。 Java Launcher $ AppClassLoader 我不知道如何从Jar内的Jar中加载类 类路径。试着用 jar:file:jarname.jar!/commons-logging.jar也引领了一个死胡同。 这种方法只有在你安装(即分散)时才有效 支持Jar文件到jarname.jar文件所在的目录 安装。
另一种方法是解压缩所有相关的Jar文件并重新打包它们 在jarname.jar文件中。这种方法往往很脆弱 慢,并且可能会遇到重复的资源问题。
其他选择:
答案 2 :(得分: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>
答案 3 :(得分:0)
有时你可以直接使用jar内容,只需解压缩
<unzip src="/Developer-Java/mysql-connector-java/mysql-connector-java-5.1.22-bin.jar" dest="${build_dir}" />