我已经把头发拉了一个星期试图找出我在这里做错了什么,包括试图在这个网站和谷歌上找到解决方案,但我想也许我不知道我在做什么我正在寻找。非常感谢任何帮助!
我的目标是在我在Eclipse Kepler中创建的Maven 2 Java项目中使用log4j 1.2.17。我从Maven原型重新创建了这个问题:quickstart,然后在pom.xml中添加了log4j依赖,就像这样......
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
以便运行'maven package'快乐地构建......
import org.apache.log4j.Logger;
import org.apache.log4j.LogManager;
import org.apache.log4j.BasicConfigurator;
public class App
{
private static Logger logger =
LogManager.getLogger( App.class );
public static void main( String[] args )
{
BasicConfigurator.configure();
logger.debug( "Entering the main class" );
System.out.println( "Hello World!" );
}
}
但是在maven构建之后在命令行上运行'java -cp target / dc-0.1.jar DC.dc.App'会导致:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/log4j/LogManager
at DC.dc.App.<clinit>(App.java:14)
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:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 1 more
我遵守Maven目录结构,log4j.properties存储在/ src / main / resources中。这是log4j文件。
log4j.appender.consoleAppender = org.apache.log4j.ConsoleAppender
log4j.appender.consoleAppender.layout = org.apache.log4j.PatternLayout
log4j.appender.consoleAppender.layout.ConversionPattern=%-4r [%t] %-5p %c %x - %m%n
log4j.rootLogger = DEBUG, consoleAppender
答案 0 :(得分:2)
拼写完后,解决方案更容易找到。我在pom.xml中添加了以下内容:
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>fully.qualified.MainClass</mainClass>
</manifest>
</archive>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
然后跑mvn clean compile assembly:single
然后运行应用程序java -cp target/dc-0.1-jar-with-dependencies.jar DC.dc.App
一切都很开心。我在how-can-i-create-an-executable-jar-with-dependencies-using-maven找到了解决方案。
答案 1 :(得分:1)
java类路径中缺少log4j jar。
如果您知道log4j jar在文件系统上的位置,则可以将其附加到-cp
classpath参数。
如果要复制或捆绑依赖项,可以考虑使用maven-dependency-plugin,请参阅usage。在this SO post上讨论了很多备选方案。
另一种测试jar项目并让maven构建运行时类路径的方法是通过maven单元或integration test。
答案 2 :(得分:1)
我喜欢Furlong提供的答案。如果由于任何原因无效,您可以尝试以下解决方案。
我认为您需要使用以下maven插件:
This plugin provides the capability to package the artifact in an uber-jar,
including its dependencies and to shade -
i.e. rename - the packages of some of the dependencies.
你可以find it here
当你有插件并执行以下内容时:
mvn package
它将构建一个所谓的uberjar。它包含所有依赖jar文件的内容,作为一个单个大胖jar文件。
所以它也将包含org.apache.log4j.LogManager类。