3

我已经花了一周的时间试图找出我在这里做错了什么,包括试图在这个网站上和通过谷歌找到解决方案,但我想也许我不知道我在寻找什么. 任何帮助是极大的赞赏!

我的目标是在我在 Eclipse Kepler 中创建的 Maven 2 Java 项目中使用 log4j 1.2.17。我已经从 Maven 原型重新创建了问题:快速入门,然后像这样在 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
4

3 回答 3

3

拼写出来后,解决方案更容易找到。我将以下内容添加到 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找到了解决方案。

于 2013-08-29T18:42:51.707 回答
1

我喜欢弗隆提供的答案。如果由于任何原因它不起作用,您可以尝试以下解决方案。

我认为您需要使用以下 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.

你可以在这里找到

当您拥有插件并执行以下操作时:

mvn package

它将构建一个所谓的 uberjar。它包含所有依赖 jar 文件的内容作为单个大胖 jar 文件。

所以它也将包含 org.apache.log4j.LogManager 类。

于 2013-11-13T11:04:32.333 回答
1

java 类路径中缺少 log4j jar。如果您知道 log4j jar 在文件系统上的位置,则可以将其附加到-cp类路径参数中。

如果要复制或捆绑依赖项,可以考虑使用maven-dependency-plugin ,请参阅用法在这个 SO 帖子上讨论了很多替代方案。

另一种测试 jar 项目并让 maven 构建运行时类路径的方法是通过 maven 单元或集成测试

于 2013-08-29T03:00:00.257 回答