2010-12-27 17 views
6

Java kaynak kodumda, uygulamanızın "lib" dizininde saklanan java arşivlerinden (.jar) farklı sınıflar kullanmak istiyorum. Ama "karınca koşusu" yaparsam, her zaman "java.lang.NoClassDefFoundError" mesajını alırım. Düzeltmek için birkaç şey denedim ama hiçbir şey işe yaramadı ... Belki birileri bana yardım edebilir mi?Ant build.xml dosyasında dış kütüphaneler nasıl eklenir?

Bu benim build.properties dosyası:

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 

Bu benim Build.xml geçerli:

<?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> 

Herkesin yardımcı olabilir iyi olurdu.

Şerefe!

Benny

+0

ne 'lib' dizin benziyor? Tüm jar dosyaları bu dizine dökülmüş mü yoksa alt dizinler var mı? –

+0

Tüm jar dosyaları bu dizinde (herhangi bir alt dizin olmadan). Yapı şöyle: ./lib/log4j-1.2.9.jar,./lib/cobertura.jar, ./lib/easymock-3.0.jar, ... Bu kitaplıkları jar dosyama nasıl ekleyebilirim? –

cevap

0

Sana <java> görev için sınıf yolunu ayarlamak için çalışıyorlar görüyoruz.

sen denediniz:

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

DÜZENLEME: çift özellikleriniz dosyada değerleri kontrol edin. lib.dir veya jar.dir değeri için sondaki boşluklarınız var mı?

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

karınca Harici bir build.properties gerekli kavanoz koymak bile javactır aracılığıyla benim program oluşturmak dosya ve pathelement bunları referans başarısız veya sınıf yolu refid.

bir harici dosyadan karınca yükler özellikleri bu özelliklerin değerini dokunmuyor, sondaki boşlukları örneğin kesilmiş olmayacaktır.

değeri derlemek için gerekli bir kavanoz gibi bir dosya yolu, temsil ediyorsa, değeri gerektirir görev , örneğin Javac nedeniyle sonunda boşluk için bu dosyası olamaz çünkü hazırlanması için başarısız olur .

+0

Bunu kullandığımda, "karınca derlemesi" sırasında bir hata alıyorum. Şu anda harici jar dosyalarının her bir kaynak kodu dosyasını ayıklayıp kendi "src" dizinine koyarım. O zaman projemi derlerken ve çalıştırırken bağımlılıklarım dahil olduğu için projemi sorunsuzca çalıştırabilirim. Ama bence bu en iyi kullanım örneği değil. Ancak şimdiye kadar, kendi jar dosyamda harici jar dosyaları sağlayacak başka bir çözüm bulamadım. Bana söylediğim gibi, manifestteki classpath deklarasyonu üzerine tekrar odaklanmam gerektiğini düşünüyorum ... –

+0

@Benny Neugebauer - yol değerleri için herhangi bir izleyici boşluk olup olmadığını görmek için özellik dosyalarınızı iki kez kontrol edin. –

3

çalışacak senin build.properties dosyadan jar.dir=build/jar ile classes.dir=build/classes ve jar.dir=${build.dir}/jar ile classes.dir=${build.dir}/classes değiştirilmesi.

2

Lütfen hedef jarmu aşağıdaki gibi düzenleyin. Eminim işe yarayacak.

<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>