Java: скрипт Ant работает как шарм, но Jar выдает исключения - PullRequest
0 голосов
/ 10 марта 2012

Я создал свой первый скрипт Ant, и он работает довольно хорошо. Он компилирует все мои исходные коды Java, создает файл .jar и запускает программу даже без предупреждения.

Но когда я пытаюсь запустить мой .jar из командной строки, я получаю исключения NoClassDefFoundError.

Итак, как перевести этот фрагмент Ant для работы из командной строки?

<property name="main.class" value="de.bfs.radon.omsimulation.OMMainFrame"/>

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

<target name="run" depends="jar">
  <java fork="true" classname="${main.class}">
    <classpath>
      <path refid="classpath"/>
      <path location="${bin.dir}/omsimulation-${version}.jar"/>
    </classpath>
  </java>
</target>

Это командная строка:

# java -classpath lib/ -jar bin/omsimulation-0.4.45-beta3.jar

Выдает:

Exception in thread "AWT-EventQueue-0" java.lang.NoClassDefFoundError: com/toedter/calendar/JDateChooser
    at de.bfs.radon.omsimulation.OMMainFrame.(OMMainFrame.java:133)
    at de.bfs.radon.omsimulation.OMMainFrame$1.run(OMMainFrame.java:106)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)

Почему мой файл .jar не работает с указанным путем к классам? Далее по сценарию Ant:

<target name="jar" depends="manifest">
  <mkdir dir="${bin.dir}" />
  <jar jarfile="${bin.dir}/omsimulation-${version}.jar" manifest="${src.dir}/omsimulation.manifest" compress="no" basedir="${build.dir}" includes="de/**" />
</target>

<target name="manifest" depends="compile">
  <manifestclasspath property="manifest.cp" jarfile="${bin.dir}/omsimulation-${version}.jar">
    <classpath refid="classpath" />
  </manifestclasspath>
  <manifest file="${src.dir}/omsimulation.manifest">
    <attribute name="Built-By" value="${author}"/>
    <attribute name="Main-Class" value="${main.class}"/>
  </manifest>
</target>

Опять же, запуск сценария Ant работает нормально. Я даже пытался добавить указанные библиотеки в мой .jar, но это только увеличивает размер файла, проблема все еще сохраняется.

<jar jarfile="${bin.dir}/omsimulation-${version}.jar" manifest="${src.dir}/omsimulation.manifest" compress="no" basedir="${build.dir}"> <!-- includes="de/**" /-->
  <fileset dir="${lib.dir}">
    <include name="**/*.jar" />
  </fileset>
</jar>

Есть идеи по этому поводу?

Большое спасибо, donc_oe

решено : Благодаря восприятию искомая командная строка unix:

# java -cp lib/*:bin/myjarfile.jar my.package.MyMainClass

А для Windows (обратите внимание на ; точка с запятой):

# javaw -cp lib/*;bin/myjarfile.jar my.package.MyMainClass

Ответы [ 2 ]

1 голос
/ 10 марта 2012

В вашем скрипте сборки нужно отметить следующее:

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

С помощью этого небольшого фрагмента вы определили конструкцию path в Ant, которую вы затем используете в своей задаче run:

<target name="run" depends="jar">
  <java fork="true" classname="${main.class}">
    <classpath>
      <path refid="classpath"/>
      <path location="${bin.dir}/omsimulation-${version}.jar"/>
    </classpath>
  </java>
</target>

Это выполняется:

java -cp ${lib.dir}/*.jar:${bin.dir}/omsimulation-${version}.jar ${main.class}

Конечно, он делает это без волнистых линий и полностью замещенных путей. Главное, что команда, которую вы пытаетесь запустить самостоятельно, вовсе не эквивалентна. При попытке вызвать из командной строки вам нужно будет включить в classpath все необходимые JAR-файлы, содержащие ваш код и все сторонние библиотеки. Предполагая, что все еще находится в папках, созданных Ant, что-то вроде:

java -cp <full-path-to-lib>/* -jar <full-path-to-bin>/omsimulation-0.4.45-beta3.jar

Или:

java -cp <full-path-to-lib?/*:<full-path-to-bin>/omsimulation-0.4.45-beta3.jar <MainClass>
0 голосов
/ 10 марта 2012

ClassDefNotFoundException, скорее всего, возникает, когда класс найден в classpath, но он загружен в другой загрузчик классов или по неправильному пути и т. Д.

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

Скорее всего, вам нужно решение, описанное в Самый простой способ объединить выпуск в один файл JAR .Мой личный фаворит - one-jar .

...