2012-04-15 21 views
7

javaプロジェクトに外部jarを含める必要があります。私はアリを使用しています。外部.jarはlibフォルダにあります。私のbuild.xmlは次のようになります:Antに外部の.jarが含まれています

<?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が存在しません。

正確なエラー:

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

質問を編集して正確なエラーを表示できますか? – Tom

+0

正確なエラーを追加しました。 – Pajushka

+0

通常のjarに外部ライブラリを簡単に含めることはできません。それを達成するには、ワンジャーのような特別な作業が必要です。 – oers

答えて

4

あなたが含まれ属性なしで試してみてください:

<fileset dir="lib" /> 

とJAR部分にあなたはこのようなクラスが含まれます:

<zipgroupfileset includes="*.jar" dir="lib"/> 
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> 
1

あなたは瓶の中に外部ライブラリを入れて、クラスローダは、これらのjarファイルを使用するように期待することはできません。残念ながら、これはサポートされていません。

one jarのような、必要なものがすべて含まれたjarファイルの作成に役立つAntタスクがあります。

このビットはbackground information of one jarからです:

Unfortunately this is does not work. The Java Launcher$AppClassLoader does not know how to load classes from a Jar inside a Jar with this kind of Class-Path. Trying to use jar:file:jarname.jar!/commons-logging.jar also leads down a dead-end. This approach will only work if you install (i.e. scatter) the supporting Jar files into the directory where the jarname.jar file is installed.

Another approach is to unpack all dependent Jar files and repack them inside the jarname.jar file. This approach tends to be fragile and slow, and can suffer from duplicate resource issues.

他の代替:

  • jarjar:ジャー・ジャーのリンクが簡単にJavaライブラリを再パッケージ化し、独自のディストリビューションにそれらを埋め込むことが可能なユーティリティです
+0

あまり正確ではないが、例えばHadoopのようないくつかのアプリケーションは、jarをlibディレクトリに置くという慣習をサポートしており、アプリケーションはそれらをクラスパス上に置くことを扱う。 –

+1

@DavidParksしかし、Hadoopは独自のクラスローダーを使用しているためです。これはアプリケーション固有のものであり、公式のjar定義の一部ではありません。 – oers

0

時々、jarコンテンツを直接使用することができます。ただちに解凍します。

 <unzip src="/Developer-Java/mysql-connector-java/mysql-connector-java-5.1.22-bin.jar" dest="${build_dir}" /> 
関連する問題