2013-08-29 2 views
3

나는이 사이트와 Google을 통해 솔루션을 찾으려고 노력하는 것을 포함하여 내가 여기서 잘못하고있는 것을 알아 내려고 일주일 내내 머리를 꺼내왔다. 그러나 나는 어쩌면 나는 내가 무엇을 찾고 있는지 모른다. 어떤 도움이라도 대단히 감사합니다!log4j 1.2를 완전히 Maven 빌드에 통합하는 방법

제 목표는 Eclipse Kepler에서 만든 Maven 2 Java 프로젝트에서 log4j 1.2.17을 사용하는 것입니다. 나는 메이븐 아키 타입에서 문제를 다시 한 : 빠른 시작을 다음과 같이 pom.xml 파일에서 log4j에 의존 ...

<dependency> 
    <groupId>log4j</groupId> 
    <artifactId>log4j</artifactId> 
    <version>1.2.17</version> 
    </dependency> 

그래서 '받는다는 패키지'를 실행하면 행복하게 빌드를을 ... 추가

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!"); 
    } 
} 

그러나 실행하는 받는다는이에 결과를 빌드 한 후 명령 행에서 '자바 -cp 대상/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 

내가 메이븐 디렉터리 구조를 준수하고있어 log4j.properties는 st입니다./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 

답변

1

log4j jar가 java 클래스 경로에서 누락되었습니다. 파일 시스템에서 log4j jar의 위치를 ​​알고 있다면 클래스 경로 인수 -cp에 추가 할 수 있습니다.

종속성을 복사하거나 묶으려면 maven-dependency-plugin을 사용하십시오. usage을 참조하십시오. 많은 대안들이 this SO post에서 논의되었습니다.

jar 프로젝트를 테스트하고 maven이 런타임 클래스 패스를 빌드하는 또 다른 방법은 Maven 유닛 또는 integration test을 사용하는 것입니다.

+0

Eclipse에서 maven없이 응용 프로그램을 실행할 때 올바른 pom.xml 파일과 관련된 문제가 발생하지만 적절한 log4j 파일이 나열되어 있습니다. 그게 구체적으로 자세히 설명해 주시겠습니까? 필자는 Maven 의존성 플러그인 사용법 페이지를 읽었고 올바르게 사용하고 있다고 믿었 기 때문에 문제는 특별히 log4j를 pom 파일의 플러그인으로 나열하는 방법이어야합니다. – Furlong

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

나는 Furlong이 제공 한 답변을 좋아합니다. 어떤 이유로 든 작동하지 않으면 아래에서이 솔루션을 사용해보십시오.

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. 그것은 모든 큰 종속 항아리 파일의 내용을 하나의 큰 뚱뚱한 항아리 파일로 포함합니다.

그래서 org.apache.log4j.LogManager 클래스도 포함됩니다.

관련 문제