2011-11-26 2 views
1

com.nik.mypackage 패키지에 main 메소드가있는 클래스가있는 Java 프로젝트가 있습니다. 하나의 라이브러리 만 참조되었습니다. someLib-5.0.2.jarAnt 빌드를 사용하여 만든 jar 파일에 NoClassDefFound 오류가 발생했습니다.

이 라이브러리는 Eclipse의 lib 폴더에 있으며 빌드 경로에 추가됩니다.

나는 아래 개미 스크립트 대상을 사용하여 응용 프로그램의 실행 항아리를 만드는 오전은 :

<property name="src" location="src"/> 
<property name="build" location="build"/> 
<property name="dist" location="dist"/> 

    <target name="init"> 
     <tstamp/> 
     <mkdir dir="${build}"/> 
    </target> 


<target name="compile" depends="init" 
    description="compile the source " > 
     <javac srcdir="${src}" destdir="${build}"> 
     <classpath> 
     <pathelement path="${classpath}"/> 
       <pathelement location="lib/someLib-5.0.2.jar"/> 
     </classpath> 
     </javac> 
    </target> 

<target name="dist" depends="compile" description="generate the distribution" > 
    <!-- Create the distribution directory --> 
    <mkdir dir="${dist}/lib"/> 
<copy todir="${build}/lib" verbose="true" file="lib/someLib-5.0.2.jar" /> 

     <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --> 
     <jar jarfile="${dist}/lib/myProject-${DSTAMP}.jar" basedir="${build}"> 

     <manifest> 
      <attribute name="Main-Class" value="com.nik.mypackage.MainClass"/> 
      <attribute name="Class-Path" value="../lib/someLib.jar"/> 
     </manifest> 
</jar> 
</target> 

항아리 MyProject를-20111126.jar가 만들어지고 있습니다. 그러나, 아래의 명령을 실행 :

c:>java -jar MyProject-20111126.jar 

내가 뭘 잘못

someLib.jar

에서 클래스에 대한 NoClassDefFoundError를 던지고을 ??

읽어 주셔서 감사합니다.

답변

0

Eric Rosenberg의 의견에서 언급했듯이 다른 jar 파일 안에 jar 파일을 중첩 할 수 없습니다. 그래서 우리는 라이브러리를 해제하고 개별 항아리를 애플 리케이션 병에 묶어 둘 필요가 있습니다.

1

MyProject-20111126.jar을 기준으로 someLib.jar의 위치를 ​​실행할 때?

MyProject.jar에서 설정하는 classpath는 MyProject.jar의 상위 디렉토리에서 lib 폴더를 찾도록 VM에 지시합니다.

매니페스트의 ClassPath 항목은 JAR 파일의 위치를 ​​기준으로 해석됩니다. 파일 시스템에서 jar 파일을 찾는 데 사용됩니다. JAVA의 일반 클래스 로더는 JAR 파일 내에 번들 된 JAR 파일을 지원하지 않습니다.

+0

- jar 파일에서 lib 자체를 복사 중입니다 ... 그래서 항아리 안을 들여다 보려고하면, 측면 META-INF 폴더와 MainClass 패키지 구조를 따라 만들어진 lib 폴더가 있습니다. lib 폴더에 somelib jar가 포함되어 있습니다 – Nik

+2

다른 jar 파일 안에 jar 파일을 중첩시킬 수 없습니다. 라이브러리 항아리를 확장하고 애플리케이션 항아리 안에 클래스를 묶거나 파일 시스템에 항아리가 있어야하고 그에 따라 매니페스트의 상대 경로를 설정해야합니다. –

관련 문제