Включая внешний Jar при запуске файла JAR - PullRequest
1 голос
/ 19 июня 2011

Я пишу ant-файл, который скомпилирует и запустит мои java-файлы. Муравей создает файл AntLabRun.jar. Когда я пытаюсь запустить файл jar, я получаю исключение в потоке "main" java.lang.NoClassDefFoundError.

Вот грубый вид каталога

-lib / resources.jar

-src / ** / pkg1 / AntLabMain.java

AntLabMain импортирует пакет, найденный внутри resources.jar

<target name="init">
        <property name="src" location="src"/>
        <property name="build" location="build"/>
        <property name="apidoc" location="apidoc"/>
        <property name="lib" location="lib"/>
        <path id="path.base">
         <pathelement path="${build}" />
         <fileset dir="lib">
            <include name="*.jar" />
         </fileset>
      </path>          
   <manifestclasspath property="manifest.classpath" jarfile="resources.jar">
   <classpath location="${lib}"/>
   </manifestclasspath>
        </target>
<!-- I excluded the unnecessary targets -->

target name="jar" depends="compile">
        <jar destfile="AntLabRun.jar" basedir="${build}">
   <include name="edu/**/*.class"/>
   <manifest>
        <attribute name="Main-Class" value="edu.gatech.oad.antlab.pkg1.AntLabMain"/>
        <attribute name="Class-Path" value="${manifest.classpath}"/>
   </manifest>
              </jar>
    </target>
    <target name="run" depends="jar">
        <java jar="AntLabRun.jar" fork="true">
        </java>
    </target>

Я просмотрел все вопросы, связанные с этим, и пока не нашел решения.

1 Ответ

2 голосов
/ 19 июня 2011

Вы можете использовать элемент pathelement. Пример:

    <!-- Define the CLASSPATH -->
<path id="compile.classpath">
    <pathelement location="lib/resources.jar" />
</path>

Затем указывайте id при использовании элемента javac. Пример:

<javac srcdir="${src.home}" destdir="${work.home}/bin" debug="on">
    <classpath refid="compile.classpath" />
</javac>

Лучше поставить каждый из вышеперечисленных под свои targets, (для меня в любом случае).

Вы также можете использовать несколько элементов pathelement в элементе path для более чем одной ссылки на банку.

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

<target name="create_manifest">
        <manifest file="${work.home}/META-INF/MANIFEST.MF">
            <attribute name="Manifest-Version" value="1.0" />
            <attribute name="Version" value="${app.version}" />
            <attribute name="Company" value="Comp Name here" />
            <attribute name="Project" value="${app.name}" />
            <attribute name="Java-Version" value="${java.version}" />

<!--Here is the reference to jar files this jar manifest will reference.-->
            <attribute name="Class-Path" value="one.jar two.jar three.jar etc.jar" />
        </manifest>
    </target>

Ниже приведен пример target s для копирования и включения файлов классов и указания на правильный манифест при создании jar.

<target name="create_jar" depends="create_manifest, copy_all_class_files">
    <jar destfile="${guiJar}" manifest="jar_temp/META-INF/MANIFEST.MF" basedir="jar_temp">
    </jar>
</target>

<target name="copy_all_class_files">
    <copy todir="jar_temp">
        <fileset dir="classes">
            <include name="*/**" />
        </fileset>
    </copy>
</target>

Вы заметите, что тег depends имеет create_manifest и copy_all_class_files в качестве зависимости.

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

Я думаю, что частью вашей проблемы является сложность файла ant.

Попробуйте разбить каждую из ваших задач на отдельные цели и решить задачу для каждой цели, прежде чем переходить к следующей.

Таким образом, вы можете убедиться, что все ваши предыдущие материалы работают должным образом, и вам не придется беспокоиться о том, что предыдущие задачи не работают должным образом.

...