2010-12-27 6 views
6

내 Java 소스 코드에 내 응용 프로그램의 "lib"디렉토리에 저장된 Java 아카이브 (.jar)의 다른 클래스를 사용하고 싶습니다. 하지만 "ant ant"를 실행하면 항상 "java.lang.NoClassDefFoundError"메시지가 나타납니다. 나는 그것을 고치기 위해 여러 가지 시도를했지만 아무 것도 효과가 없었습니다 ... 어쩌면 누군가가 나를 도울 수 있습니까?Ant build.xml 파일에 외부 라이브러리를 포함시키는 방법은 무엇입니까?

이것은 내 build.properties 파일 :

app.name=MyApplication 
app.version=1.0 
main.class=mypackage.MyMain 
build.dir=build 
classes.dir=${build.dir}/classes 
jar.dir=${build.dir}/jar 
dist.dir=dist 
src.dir=src 
test.dir=test 
lib.dir=lib 

이 내 의 build.xml입니다 :

<?xml version="1.0" encoding="UTF-8" ?> 
<project name="My Project" default="run" basedir="."> 
    <description>My description.</description> 

    <property file="build.properties" /> 
    <path id="classpath"> 
    <fileset dir="${lib.dir}" includes="*.jar"/> 
    </path> 

    <!-- Initialization --> 
    <target name="init" description="Prepare needed directories."> 
    <mkdir dir="${build.dir}" /> 
    <mkdir dir="${classes.dir}" /> 
    <mkdir dir="${jar.dir}" /> 
    <mkdir dir="${dist.dir}" /> 
    <mkdir dir="${lib.dir}" /> 
    </target> 

    <!-- Cleanup --> 
    <target name="clean" description="Remove all files created by the build/test process."> 
    <delete dir="${classes.dir}" /> 
    <delete dir="${dist.dir}" /> 
    </target> 

    <!-- Compile application --> 
    <target name="compile"> 
    <mkdir dir="${classes.dir}"/> 
    <javac srcdir="${src.dir}" 
     destdir="${classes.dir}" 
     debug="yes" 
     includeantruntime="false"> 
     <!-- <classpath refid="classpath" /> --> 
    </javac> 
    </target> 

    <!-- Java Archive --> 
    <target name="jar" depends="compile"> 
    <!--<delete file="${jar.dir}/${app.name}-${app.version}.jar"/>--> 
    <delete dir="${jar.dir}"/> 
    <mkdir dir="${jar.dir}"/> 
    <jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}"> 
     <manifest> 
     <attribute name="Class-Path" value="${lib.dir}"/> 
     <attribute name="Main-Class" value="${main.class}"/> 
     </manifest> 
    </jar> 
    </target> 

    <!-- Run application --> 
    <target name="run" depends="jar"> 

    <java jar="${jar.dir}/${app.name}-${app.version}.jar" 
     fork="true"> 
    </java> 
    <!-- 
    <java fork="true" classname="${main.class}"> 
     <classpath> 
     <path refid="classpath"/> 
     <path location="${jar.dir}/${app.name}-${app.version}.jar"/> 
     </classpath> 
    </java> 
    --> 
    </target> 
</project> 

누군가가 도울 수 있다면 좋을 것이다.

건배!

베니

+0

무엇을 당신의'lib' 디렉토리가 생겼는데? 모든 jar 파일이 해당 디렉토리에 덤프되었거나 서브 디렉토리가 있습니까? –

+0

모든 jar 파일은 하위 디렉토리없이 해당 디렉토리에 있습니다. 구조는 다음과 같습니다. ./lib/log4j-1.2.9.jar,./lib/cobertura.jar, ./lib/easymock-3.0.jar, ... jar 파일에 어떻게 라이브러리를 포함시킬 수 있습니까? –

답변

0

난 당신이 <java> 작업에 대한 클래스 경로를 설정하려고 한 것을 알 수 있습니다.

는 시도 유무 :

<java jar="${jar.dir}/${app.name}-${app.version}.jar" fork="true"> 
    <classpath refid="classpath" /> 
</java> 

편집 : 더블 당신의 특성 파일의 값을 확인합니다. lib.dir 또는 jar.dir의 값에 후행 공백이 있습니까?

http://ant.apache.org/faq.html#properties-not-trimmed

개미 내가 외부 build.properties에 필요한 항아리를 를 넣어 경우에도 javac의를 통해 내 프로그램을 빌드 파일 및 pathelement으로이를 참조하는 데 실패 또는 클래스 경로는 REFID.

외부 파일 개미 부하의 특성은 특성의 값 접촉하지 않는 후미 공백 은, 예를 들어 트리밍되지 않는다.

값이 컴파일하는 데 필요한 항아리와 같은 파일 경로, 을 나타내는 경우, 값을 필요로하는 작업 는 예에서 javac 인해 후행 공백에이 파일을 찾을 수 없기 때문에 컴파일 실패 .

+0

이것을 사용하면 "ant compile"하는 동안 오류가 발생합니다. 현재 외부 jar 파일의 모든 소스 코드 파일을 추출하여 내 "src"디렉토리에 저장합니다. 그렇다면 프로젝트를 컴파일하고 실행할 때 종속성이 포함되므로 문제없이 프로젝트를 실행할 수 있습니다. 하지만 이것이 최선의 사용 사례는 아니라고 생각합니다. 하지만 지금까지 내 자신의 jar 파일에 외부 jar 파일을 제공 할 다른 해결책을 찾지 못했습니다. 나는 네가 나에게 말했듯이 매니페스트의 클래스 패스 선언에 다시 집중해야한다고 생각한다 ... –

+0

@Benny Neugebauer - 경로 값에 공백 문자가 있는지 확인하기 위해 속성 파일 항목을 두 번 확인한다. –

3

작동됩니다 build.properties 파일에서 jar.dir=build/jarclasses.dir=build/classesjar.dir=${build.dir}/jarclasses.dir=${build.dir}/classes 교체.

2

다음과 같이 대상 jar를 편집하십시오. 나는 그것이 효과가있을 것이라고 확신한다.

<target name="jar" depends="compile"> 

<delete dir="${jar.dir}"/> 
<mkdir dir="${jar.dir}"/> 
<jar destfile="${jar.dir}/${app.name}-${app.version}.jar" basedir="${classes.dir}"> 
    <manifest> 
    <attribute name="Class-Path" value="${lib.dir}"/> 
    <attribute name="Main-Class" value="${main.class}"/> 
    </manifest> 
    <zipgroupfileset dir="${lib.dir}"/> 

</jar> 

관련 문제