Log4j не добавляется в classpath в Ant - PullRequest
3 голосов
/ 22 июля 2011

Я пытаюсь добавить Log4j в путь к классам моего проекта в Ant, который создает исполняемый JAR, но кажется, что он не добавляется должным образом.

Вот компонент path моего скрипта сборки Ant:

<path id="classpath.compile">
  <fileset dir="${dir.myLibs}">
    <include name="**/*.jar"/>
  </fileset>
  <pathelement location="${dir.webContent}/WEB-INF/lib/log4j.jar" />
</path>

Цель компиляции выглядит так:

<target name="-compile">
  <javac destdir="${dir.binaries}" source="1.6" target="1.6" debug="true" includeantruntime="false">
    <src path="${dir.source}"/>
    <classpath refid="classpath.compile"/>
  </javac>
</target>

Цель, которая создает JAR:

<target name="-createJar" >
  <jar jarfile="${path.jarFile}"
     manifest="${dir.source}\META-INF\MANIFEST.MF">
    <fileset dir="${dir.binaries}" casesensitive="yes">
      <exclude name="**/*.java"/>
    </fileset>
  </jar>
</target>

Наконец, MANIFEST.MF:

Manifest-Version: 1.0
Class-Path: ../../../WebContent/WEB-INF/lib/log4j.jar (what is this pathing relative to?)
Main-Class: foo.Bar

JAR создан, но когда я его выполняю, я получаю:

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/Logger...

Есть мысли о том, что я делаю не так?

Ответы [ 3 ]

1 голос
/ 22 июля 2011

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

1 голос
/ 22 июля 2011

По пути к классам в вашем МАНИФЕСТЕ вы видите, что вы пытаетесь сослаться на банку внутри вашей банки.Единственные два способа заставить это работать AFAIK - это 1) специальный загрузчик классов, как упоминает @ infosec812, или 2), взорвав зависимости jar непосредственно в корне вашего jar.Либо это работоспособно, но я не вижу ни одного из них в вашем скрипте муравья.

Если вы пытаетесь сослаться на банку за пределами вашей банки, ваш относительный путь к классу относительно местоположения банки.Вы исполняете.Убедитесь, что указанный файл существует в этом месте.

1 голос
/ 22 июля 2011

Я предполагаю, что вы запускаете программу Java следующим образом

java -jar myapp.jar

В этом случае вам необходимо указать атрибут Class-Path в манифесте. Я предлагаю вам также проверить manifestclasspath task

...