Как включить несколько jar в classpath, используя ant? - PullRequest
3 голосов
/ 23 декабря 2009

У меня есть куча файлов .java в папке "src", которые зависят от трех jar-файлов в папке "lib". У меня есть следующий файл build.xml:

<?xml version="1.0"?>
<project name="MyProj" basedir=".">
 <property name="src"   value="src"/>
 <property name="build" value="build"/>
 <property name="lib"   value="lib"/>


 <path id="master-classpath">
   <fileset dir="${lib}">
     <include name="activemq-all-5.1-SNAPSHOT.jar"/>
     <include name="geronimo-jms_1.1_spec-1.1.1.jar"/>
     <include name="activemq-core-5.3.0.jar"/>
   </fileset>
 </path>

 <javac destdir="${build}">
   <src path="${src}"/>
   <classpath refid="master-classpath"/>
 </javac>

</project>

Это прекрасно компилируется, но когда я пытаюсь запустить, я получаю

"java.lang.NoClassDefFoundError: javax / JMS / Пункт назначения "

Эта программа работает и прекрасно компилируется, когда я включаю jar-файлы в путь сборки, используя Eclipse.

РЕДАКТИРОВАТЬ: Итак, я скопировал фляги в папку, где есть скомпилированные классы. Класс с основным методом - NDriver.class. Когда я пытаюсь:

java -classpath ./geronimo-jms_1.1_spec-1.1.1.jar:./activemq-core-5.3.0.jar:./activemq-all-5.1-SNAPSHOT.jar NDriver

Это дает:

Исключение в теме "главная" java.lang.NoClassDefFoundError: NDriver

Буду признателен за любую помощь.

Ответы [ 4 ]

3 голосов
/ 23 декабря 2009

Вам нужно поместить jar-файлы, используемые во время компиляции, в classpath, когда запускает приложение. К сожалению, вы не предоставили каких-либо подробностей о том, как вы на самом деле его используете, поэтому сложно дать больше рекомендаций.

ОБНОВЛЕНИЕ: Каталог, содержащий скомпилированные классы, также необходимо добавить в путь к классам. Если вы запускаете java из каталога, содержащего скомпилированные классы, вы можете использовать . для обозначения текущего каталога. Добавьте его в classpath, как показано ниже, чтобы указать java искать там и классы (я добавил . сразу после activemq-all-5.1-SNAPSHOT.jar):

java -classpath ./geronimo-jms_1.1_spec-1.1.1.jar:./activemq-core-5.3.0.jar:./activemq-all-5.1-SNAPSHOT.jar:. NDriver
2 голосов
/ 23 декабря 2009

В одну сторону (немного отличающиеся от ваших переменных)

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

<manifestclasspath property="manifest.classpath" jarfile="${jarfile}">
    <classpath refid="classpath"/>
</manifestclasspath>

<target name="jar" depends="compile" description="create the jar">
    <jar destfile="${jarfile}" basedir="${build.dir}">
        <manifest>
            <attribute name="Manifest-Version" value="${manifest-version}"/>
            <attribute name="Created-By" value="${ant.java.version}"/>
            <attribute name="Main-Class" value="${main-class}"/>
            <attribute name="Class-Path" value="${manifest.classpath}"/>
        </manifest>
    </jar>
</target>

Конечно, здесь я предполагаю, что вы создаете банку и запускаете ее (включая там путь к классам). Другой вариант - иметь цель run, которая использует тег <java> и явно использовать там путь к классам.

1 голос
/ 23 декабря 2009

Включены ли библиотеки jar в classpath при запуске программы? Eclipse автоматически добавляет их, но вам необходимо указать их при запуске программы из командной строки.

0 голосов
/ 23 декабря 2009

По моему опыту, Eclipse часто будет включать классы и jar-файлы в classpath без явного использования объявления classpath. Действительно, иногда бывает довольно сложно удалить классы из сборки Eclipse (их нужно удалить или очистить).

...