Как включить внешние библиотеки в файл Ant build.xml? - PullRequest
6 голосов
/ 28 декабря 2010

В моем исходном коде Java я хочу использовать разные классы из архивов Java (.jar), которые хранятся в каталоге "lib" моего приложения. Но если я делаю "ant run", я всегда получаю сообщение "java.lang.NoClassDefFoundError". Я пробовал несколько вещей, чтобы это исправить, но ничего не помогло ... Может, кто-то здесь может мне помочь?

Это мой build.properties файл:

app.name=MyApplication
app.version=1.0
main.class=mypackage.MyMain
build.dir=build
classes.dir=${build.dir}/classes
jar.dir=${build.dir}/jar
dist.dir=dist
src.dir=src
test.dir=test
lib.dir=lib

Это мой build.xml :

<?xml version="1.0" encoding="UTF-8" ?>
<project name="My Project" default="run" basedir=".">
  <description>My description.</description>

  <property file="build.properties" />
  <path id="classpath">
    <fileset dir="${lib.dir}" includes="*.jar"/>
  </path>

    <!-- Initialization -->
  <target name="init" description="Prepare needed directories.">
    <mkdir dir="${build.dir}" />
    <mkdir dir="${classes.dir}" />
    <mkdir dir="${jar.dir}" />
    <mkdir dir="${dist.dir}" />
    <mkdir dir="${lib.dir}" />
  </target>

    <!-- Cleanup -->
  <target name="clean" description="Remove all files created by the build/test process.">
    <delete dir="${classes.dir}" />
    <delete dir="${dist.dir}" />
  </target>

    <!-- Compile application -->
  <target name="compile">
    <mkdir dir="${classes.dir}"/>
    <javac srcdir="${src.dir}" 
       destdir="${classes.dir}" 
       debug="yes"
       includeantruntime="false">
      <!-- <classpath refid="classpath" /> -->
    </javac>
  </target>

    <!-- Java Archive -->
  <target name="jar" depends="compile">
    <!--<delete file="${jar.dir}/${app.name}-${app.version}.jar"/>-->
    <delete dir="${jar.dir}"/>
    <mkdir dir="${jar.dir}"/>
    <jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}">
      <manifest>
        <attribute name="Class-Path" value="${lib.dir}"/>
        <attribute name="Main-Class" value="${main.class}"/>
      </manifest>
    </jar>
  </target>

    <!-- Run application -->
  <target name="run" depends="jar">

    <java jar="${jar.dir}/${app.name}-${app.version}.jar" 
        fork="true">
    </java>
    <!--
    <java fork="true" classname="${main.class}">
      <classpath>
         <path refid="classpath"/>
         <path location="${jar.dir}/${app.name}-${app.version}.jar"/>
      </classpath>
    </java>
    -->
  </target>
</project>

Было бы неплохо, если бы кто-нибудь мог помочь.

Ура!

Benny

Ответы [ 3 ]

3 голосов
/ 07 ноября 2012

Замена classes.dir=${build.dir}/classes на classes.dir=build/classes и jar.dir=${build.dir}/jar на jar.dir=build/jar из вашего build.properties файла будет работать.

2 голосов
/ 12 февраля 2014

Пожалуйста, отредактируйте целевой сосуд следующим образом. Я уверен, что это сработает.

<target name="jar" depends="compile">

<delete dir="${jar.dir}"/>
<mkdir dir="${jar.dir}"/>
<jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}">
  <manifest>
    <attribute name="Class-Path" value="${lib.dir}"/>
    <attribute name="Main-Class" value="${main.class}"/>
  </manifest>
   <zipgroupfileset  dir="${lib.dir}"/>

</jar>

0 голосов
/ 28 декабря 2010

Я вижу, что вы пытались установить свой путь к классу для задачи <java>.

Вы пробовали:

<java jar="${jar.dir}/${app.name}-${app.version}.jar" fork="true">
  <classpath refid="classpath" />
</java>

РЕДАКТИРОВАТЬ: дважды проверьте значения в вашем файле свойств. Есть ли у вас пробелы для значения lib.dir или jar.dir?

http://ant.apache.org/faq.html#properties-not-trimmed

ant не смог собрать мою программу через Javac, даже когда я поставил необходимые банки во внешнем файле build.properties и ссылаться на них с помощью pathelement или classpath refid.

Когда муравей загружает свойства из внешний файл не касается стоимость недвижимости, конечные пробелы не будет обрезаться, например.

Если значение представляет путь к файлу, как банку нужно собрать, задача который требует значения, JAVAC для пример не удастся скомпилировать, так как не могу найти файл из-за трейлинга пространства.

...