2011-08-09 2 views
0

이 빌드 파일에는 어떤 문제가 있습니까? 그것은 기본적으로 두 jar 파일을 AbsoluteLayout.jar 스윙 레이아웃-1.0.3.jarJava ant 빌드에서 문제 발생 (클래스 경로를 올바르게 설정하지 않음)

<?xml version="1.0"?> 
    <project> 
    <property name="srcDir" location="src"/> 
    <property name="buildDir" location="build"/> 
    <property name="distDir" location="dist"/> 
    <property name="library" value="lib/"/> 


    <path id="classpath"> 
    <fileset dir="${library}"> 
     <!--<include name="**/*.jar"/>--> 
     <include name="*.jar"/> 
    </fileset> 
    </path> 

    <property name="myclasspath" refid="classpath"/> 
    <!-- Emit the property to the ant console --> 
     <echo message="Classpath = ${myclasspath}"/> 

    <target name="init"> 
    <mkdir dir="${buildDir}"/> 
    <mkdir dir="${distDir}"/> 
    </target> 

    <target name="compile" depends="init"> 
    <javac srcdir="${srcDir}" destdir="${buildDir}" classpathref="classpath"/> 
    </target> 

    <target name="dist" depends="compile"> 
    <jar destfile="${distDir}/pro.jar" basedir="${buildDir}"> 
     <manifest> 
     <attribute name="Built-By" value="${user.name}"/> 
     <attribute name="Main-Class" value="Main.Class"/> 
     </manifest> 
    </jar> 
    <!--<jar destfile="${distDir}/package-src.jar" basedir="${srcDir}"/>--> 

    </target> 

    <target name="clean"> 
    <delete dir="${buildDir}"/> 
    <delete dir="${distDir}"/> 
    </target> 
</project> 

포함되어 내가 터미널에 개미 파일을 실행 SUCCESSFUL.When를 구축했다. 내가 항아리를 실행할 때 그것은 다음과 같은 오류를주고 파일 :

왜 클래스 경로에있는 두 개의 파일을 포함하지
Exception in thread "main" java.lang.NoClassDefFoundError: org/jdesktop/layout/GroupLayout$Group 
Caused by: java.lang.ClassNotFoundException: org.jdesktop.layout.GroupLayout$Group 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:217) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:205) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:321) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:294) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:266) 

?

+1

내가 어디에서 말했는지는 알 수 없습니다. 매니페스트에 "built-by"및 "main-class"를 넣었지만 "class-path"는 무엇입니까? –

답변

1

But when I run the jar file it is giving following error:

Exception in thread "main" java.lang.NoClassDefFoundError 

이것은 런타임 오류입니다. jdesktop jar는 실행 중에 jar 파일의 클래스 경로에서 사용할 수 없습니다.

Class-Path: jar1-name jar2-name directory-name/jar3-name 

그래서 같은 :

<manifest> 
    <attribute name="Built-By" value="${user.name}"/> 
    <attribute name="Main-Class" value="Main.Class"/> 
    <attribute name="Class-Path" value="lib/jdesktop.jar"/> 
    </manifest> 

하면서 jar 파일을 실행하면 확인이 확인

java -cp .;path_jdesktop.jar; yourclass.jar 

당신은 또한 jar 파일의 classpath in the manifest file을 추가 할 수 있습니다 시도 lib 디렉토리이고인 lib 디렉토리.

0

경로 구조를 사용하여 클래스 경로를 만들 수 있습니다.

<target name="init-classpath" depends="retrieve"> 
    <path id="lib.classpath"> 
     <fileset dir="${lib}"> 
      <include name="*.jar" /> 
     </fileset> 
    </path> 
</target> 

을하지만, 클래스 경로는 공백으로 구분 된 경로 목록을한다, 그래서 당신은 당신의 경로 구조 평평해야합니다 : 예를 들어, 당신은 당신의 lib 디렉토리에서 모든 jar 파일을 읽을 수

<pathconvert property="mf.classpath" pathsep=" "> 
    <path refid="lib.classpath" /> 
    <flattenmapper /> 
</pathconvert> 

마지막으로 당신의 MF를 넣어 Class-Path 속성의 .classpath

<jar destfile="${jars}/${result.name}.${result.ext}"> 
    <manifest> 
     ... 
     <attribute name="Class-Path" value="${mf.classpath}" /> 
    </manifest> 
    ... 
</jar> 

이 경우 출력 jar과 같은 디렉토리에 라이브러리 jar를 배포해야합니다.

관련 문제