2013-11-18 16 views
1

Я пытаюсь просто Maven приложение с Log4J версии 2-бета 9. В моем файле pom.xml у меня есть эти две зависимости (как указано в Log4J Maven webpage):Как работать с CLASSPATH в проекте Maven?

<dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-api</artifactId> 
     <version>2.0-beta9</version> 
</dependency> 
<dependency> 
     <groupId>org.apache.logging.log4j</groupId> 
     <artifactId>log4j-core</artifactId> 
     <version>2.0-beta9</version> 
</dependency> 

Затмение видит Log4J библиотека:

enter image description here

Но когда я упаковать приложение и запустить его это исключение:

java -cp target/notification-1.0.0.jar com.example.Sandbox 

Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/LogManager 
    at com.example.Sandbox.<clinit>(Sandbox.java:13) 
Caused by: java.lang.ClassNotFoundException: org.apache.log4j.LogManager 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 1 more 

I выполнил поиск этого исключения и, похоже, связан с переменной CLASSPATH.

Как должен быть установлен CLASSPATH для проекта Maven?

+0

это может быть как больше log4j jar доступно в вашем пути к классу и его получение confilcted –

+0

Да, мой собственный другой проект, что зависимость для этого приложения также использует Log4J, может быть, это проблема? Я не уверен. – user2148736

+0

В Maven jar, созданный 'mvn package', не содержит его зависимостей. Поэтому вы должны добавить log4j- * в свой путь к классам. Вы можете проверить такие вещи, как maven-assembly-plugin, чтобы создать jar-with-dependencies. – khmarbaise

ответ

2

Maven - это инструмент для сборки. Это не поможет вам работает окончательное приложение.

Вы можете использовать mvn exec:java -Dexec.mainClass="com.example.Sandbox" для запуска своего приложения (см. Вопрос Maven Run Project), но это становится утомительным, когда вам нужно передать ему аргументы.

Вы можете получить, что Maven путь к классам, используемый для компиляции приложения с mvn dependency:build-classpath

Это напечатает путь к классам консоли. Обратите внимание, что оно не будет отсутствовать target/notification-1.0.0.jar

Другим полезным инструментом в этой области является assembly plugin; он создаст один очень большой JAR со всеми зависимостями, свернутыми в один файл, когда вы укажете дескриптор jar-with-dependencies.

+0

Я пробовал Maven Exec Plugin, и приложение работает правильно, спасибо. Это означает, что мое приложение не находит зависимости. Я установил maven-dependency-plugin для копирования всех зависимостей в $ {project.build.directory}/lib. Я думаю, что последнее, что мне нужно решить, - это установить путь к этому каталогу. Как это можно решить, когда я запускаю свое приложение в продуктивной среде? Сохраняется ли копирование всех целевых каталогов и задается путь к классу «./lib»? – user2148736

+0

Вам нужно установить путь к классу '' lib/* "' в этом случае; не забывайте кавычки, вы не хотите, чтобы оболочка расширила звездочку! Вы должны передать его на Java. http://stackoverflow.com/questions/1237093/using-wildcard-for-classpath –

Смежные вопросы