ANT

2016-04-01 115 views
1

yılında zipfileset tabloların listesini yeniden kullanma Ben benzer hedefleri olan bazı şişman birlikte çalıştırılabilir kavanoz koymak bir build.xml var:ANT

kodu Eclipse (İhracat çalıştırılabilir Kavanoz) tarafından ve minör ile oluşturulmuştur
<target name="create_myapp_jar"> 
    <jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain"> 
    <manifest> 
     <attribute name="Main-Class" value="com.something.entrypoints.MyApp"/> 
     <attribute name="Class-Path" value="."/> 
    </manifest> 
    <fileset dir="./classes"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-cli-1.2.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10-sources.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-io-2.4.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-lang-2.6.jar"/> 
    <zipfileset excludes="META-INF/*.SF" src="./lib/commons-pool2-2.2.jar"/> 

    lots and lots of more JARs here.... 
</target> 

benim tarafımdan değişir.

İçerdiği Kavanozların listesi aslında oldukça uzun. Bu yağ kavanozlarından birkaçını yapıyorum ve her hedef için <zipfileset> ifadelerini listelemekten nasıl kaçınabileceğimi merak ediyordum?

Bunları nasıl bir araya getirebilirim ve sonra her bir yağ-kavanoz oluşturma hedefinden onlara nasıl başvurabilirim? Hepsi benim build.xml 'in yüzlerce ve yüzlerce satıra yayılmasına izin vermemek. Ayrıca, her bir hedefe yeni bir JAR eklemenin acısı bir yerde bir tanıma sahip olsaydı giderdi. Daha sonra yeniden kullanmak üzere Jar fileset kaydetmek gerekirse

<target name="create_myapp_jar"> 
    <jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain"> 
     <manifest> 
      <attribute name="Main-Class" value="com.something.entrypoints.MyApp"/> 
      <attribute name="Class-Path" value="."/> 
     </manifest> 
     <fileset dir="./classes"/> 
     <zipgroupfileset dir="lib/" includes="*.jar" excludes="META-INF/*.SF" /> 
    </jar> 
</target> 

, yapabileceğiniz:

cevap

1

Anladığım kadarı ile, zipfileset girişler listeniz her oluşturulmuş kavanoz için her zaman aynıdır? Belki de, zipfileset girişlerini içeren bir makro oluşturmayı ve her bir hedefin bağlamı için makroyu ayarlamak için değişkenleri kullanmayı düşünmelisiniz:

<macrodef name="make-jar"> 
    <attribute name="destfile"/> 
    <attribute name="mainclass"/> 
    <attribute name="classpath"/> 
    <attribute name="obj.dir"/> 
    <sequential> 
     <jar destfile="@{destfile}" filesetmanifest="mergewithoutmain"> 
      <manifest> 
       <attribute name="Main-Class" value="@{mainclass}"/> 
       <attribute name="Class-Path" value="@{classpath}"/> 
      </manifest> 
      <fileset dir="@{obj.dir}"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-cli-1.2.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10-sources.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-codec-1.10.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-io-2.4.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-lang-2.6.jar"/> 
      <zipfileset excludes="META-INF/*.SF" src="./lib/commons-pool2-2.2.jar"/> 

      lots and lots of more JARs here.... 
     </jar> 
    </sequential> 
</macrodef> 

<target name="create_myapp_jar"> 
    <make-jar destfile="./production/myapp.jar" mainclass="com.something.entrypoints.MyApp" classpath="." obj.dir="./classes"/> 
</target> 
+0

Bu çok güzel çalıştı ve makrolar için de bir şeyim var ... her iki cevabı da "Doğru" olarak işaretleyemem. Hangisinin en iyisi olduğunu düşünmek. –

1

A zipgroupfileset Bunu gerçekleştirmek için kullanılabilir

<fileset dir="lib" id="lib_jars"> 
    <include name="*.jar"/> 
</fileset> 
<jar destfile="./production/myapp.jar" filesetmanifest="mergewithoutmain"> 
    <manifest> 
     <attribute name="Main-Class" value="com.something.entrypoints.MyApp"/> 
     <attribute name="Class-Path" value="."/> 
    </manifest> 
    <fileset dir="./classes"/> 
    <zipgroupfileset refid="lib_jars" /> 
</jar> 

DÜZENLEME:

excludes yalnızca dir dizinindeki dosyaları hariç tutar, e Ant: Exclude files from merged jar file numaralı belgede açıklandığı gibi dosyaları kendiniz kopyalayın. Orada kolay bir çözüm sağlayan bir cevap var.

+0

Teşekkürler! Bu benim acil sorunumu çözer, ancak bu sadece kavanozlar aynı dizinde (tabii ki en yaygın durum olan) bulunursa çalışır. Eğer istersem, yine de bir kavanozun listesini "gruplandırabilirim", onlara bir isim verebilirim ve sonra onun yerine isim verdim? –

+0

Çalışırken, "iş parçacığında özel" ana "java.lang.SecurityException: Manifest ana öznitelikleri için geçersiz imza dosyası özeti" aldım, dışlama gerçekten işe yarıyor mu? –

+0

@PeterAndersson Haklısınız. 'Excludes'' zipgroupfileset' için burada beklendiği gibi çalışmıyor. Cevabı güncelledim. – manouti