2010-08-20 23 views
42

Bir uygulamayı maven ile güncelleyecek bir zip dosyası oluşturmak istiyorum. Zip, bir sunucuda barındırılacak ve fermuar oluşturmak için derleme eklentisini kullanıyorum. Ancak, maven'in, geçerli sürüm numarasını zip dışında saklayan bir metin dosyasını otomatik olarak oluşturmasını isterim. Mümkün mü?Sürüm numarasını bir metin dosyasına çıkarmak için maven öğesini kullanma

EDIT: İki özel derleme oluşturmak için maven Assembly Plugin ve iki tanımlayıcıyı kullanarak başarıyla yaptım. Bir dizinin tek bir hedefi vardır ve sadece filtrelemeye dayalı güncellenmiş version.txt ile bir klasör oluşturur. Daha sonra tek bir hedefe sahip olan başka bir dosya aslında zip dosyasını paketler. Bu çok temkinli görünüyor ve sanırım tüm güncellenmiş klasörle maven repo tarihini düzgün bir şekilde değil. Bunu yapmanın daha iyi bir yolu varsa lütfen bana bildirin.

cevap

73

Tabii bir parçası olarak ikame edilecektir ${project.version} kullanmak gerekir Ne filtering

denir kastediyoruz. senin pom.xml'Bu şimdi

${project.version} 

, yapı öğesi içine bu bloğu koydu:

Dosya içeriği version.txt diyoruz (ya da herneyse), src/main/kaynaklar aşağılarında bir metin dosyası oluşturun Her derlemeden sonra dosya (hedef/sınıflarda bulabileceğiniz) geçerli sürümü içerecektir.

Dosyayı otomatik olarak başka bir yere taşımak istiyorsanız, muhtemelen maven-antrun-plugin aracılığıyla bir karınca görevi yürütmeniz gerekecek. Böyle

şey:

<build> 
    ... 
    <plugins> 
     <plugin> 
     <artifactId>maven-antrun-plugin</artifactId> 
     <version>1.4</version> 
     <executions> 
      <execution> 
      <phase>process-resources</phase> 
      <configuration> 
       <tasks> 
       <copy file="${project.build.outputDirectory}/version.txt" 
        toFile="..." overwrite="true" /> 
       </tasks> 
      </configuration> 
      <goals> 
       <goal>run</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
</build> 
+0

Bazı nedenlerden dolayı, ilk blok, sürümü hedef/sınıflara yerleştirmiyor gibi görünüyor. Version.txt dosyasını oluşturursam ikinci kod bloğu çalışır gibi görünüyor. – sanz

+0

Projeniz bir webapp mı? Daha sonra kaynak filtreleme biraz farklı çalışır. Cevabımı birkaç saat içinde güncelleyeceğim (önce akşam yemeği) :-) –

+0

Hayır ama üzerinde çalıştığım proje, tüm uygulamayı içeren bir ebeveyn projesi olan bir maven modülüdür. – sanz

10

Belirli bir kaynakta filtreleme etkinleştirin ve sonra Yapınızda

7

Ayrıca sürüm bilgisi dosyası üretmek için bir Groovy komut dosyası kullanabilirsiniz. Bu yöntemi daha çok beğeniyorum çünkü montaj-eklentinin tanımlayıcısındaki öğeleri dışarıda bırakmak zorunda değilsiniz. Bu yöntemi, yalnızca Jenkins/Hudson'dan (örn., Check BUCH_ID vb.) Kontrol ediyorsanız, yalnızca mevcut olan şeyleri dahil etmek için de kullanabilirsiniz. şu şekilde görünecektir pom.xml'Bu

<plugin> 
    <groupId>org.codehaus.mojo.groovy</groupId> 
    <artifactId>groovy-maven-plugin</artifactId> 
    <version>1.0-beta-3</version> 
    <executions> 
     <execution> 
     <phase>test</phase> 
     <goals> 
      <goal>execute</goal> 
     </goals> 
     <configuration> 
      <source> 
     <![CDATA[ 
     println("==== Creating version.txt ===="); 
     File mainDir = new File("src/main"); 
     if(mainDir.exists() && !mainDir.isDirectory()) { 
      println("Main dir does not exist, wont create version.txt!"); 
      return; 
     } 
     File confDir = new File("src/main/conf"); 
     if(confDir.exists() && !confDir.isDirectory()) { 
      println("Conf dir is not a directory, wont create version.txt!"); 
      return; 
     } 
     if(!confDir.exists()) { 
      confDir.mkdir(); 
     } 
     File versionFile = new File("src/main/conf/version.txt"); 
     if(versionFile.exists() && versionFile.isDirectory()) { 
      println("Version file exists and is directory! Wont overwrite"); 
      return; 
     } 
     if(versionFile.exists() && !versionFile.isDirectory()) { 
      println("Version file already exists, overwriting!"); 
     } 
     println("Creating Version File"); 
     BufferedWriter writer = new BufferedWriter(new FileWriter(versionFile)); 

     writer.write("groupId = ${project.groupId}"); 
     writer.newLine(); 
     writer.write("artifactId = ${project.artifactId}"); 
     writer.newLine(); 
     writer.write("version = ${project.version}"); 
     writer.newLine(); 
     writer.write("timestamp = ${maven.build.timestamp}"); 

     String buildTag = ""; 
     String buildNumber = ""; 
     String buildId = ""; 
     try { 
      buildTag = "${BUILD_TAG}"; 
      buildNumber = "${BUILD_NUMBER}"; 
      buildId = "${BUILD_ID}"; 

      writer.write("BUILD_TAG = " + buildTag + "\n"); 
      writer.write("BUILD_NUMBER = " + buildNumber + "\n"); 
      writer.write("BUILD_ID = " + buildId + "\n"); 

     } catch (Exception e) { 
      println("============= Could not find BUILD_TAG probably this is not a Jenkins/Hudson build ==========="); 
     } 

     writer.close(); 
     ]]> 
      </source> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Ve sonra montaj eklenti eklentisi:

<plugin> 
    <artifactId>maven-assembly-plugin</artifactId> 
    <version>2.2.1</version> 
    <!-- Produce the all-dependencies-included jar for java classloaders --> 
    <executions> 
     <execution> 
     <id>all</id> 
     <phase>package</phase> 
     <goals> 
      <goal>single</goal> 
     </goals> 
     <configuration> 
      <finalName>${project.artifactId}</finalName> 
      <descriptors> 
      <descriptor>dist-all.xml</descriptor> 
      </descriptors> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

Yani bir dosya üreten harika böyle pom.xml'Bu komut olacaktı

Ve nihayet montaj açıklayıcısı dist-all.xml şu şekilde görünecektir:

<?xml version="1.0" encoding="UTF-8"?> 
<assembly> 
    <id>all</id> 
    <formats> 
    <format>dir</format> 
    <format>zip</format> 
    </formats> 
    <includeBaseDirectory>false</includeBaseDirectory> 
    <fileSets> 
    <fileSet> 
     <directory>target</directory> 
     <outputDirectory></outputDirectory> 
     <includes> 
     <include>*.jar</include> 
     </includes> 
    </fileSet> 
    <fileSet> 
     <directory>src/main/conf</directory> 
     <outputDirectory></outputDirectory> 
     <includes> 
     <include>**</include> 
     </includes> 
    </fileSet> 
    </fileSets> 
</assembly> 
11

Kullanım sta ndard META-INF\MANIFEST.MF (Daha sonra sürümü almak için Java kodunu getClass().getPackage().getImplementationVersion() kullanabilirsiniz)

For.Savaş kullanımı bu yapılandırma:

<plugin> 
    <artifactId>maven-war-plugin</artifactId> 
    <version>2.1</version> 
    <configuration> 
     <archive>     
      <manifest> 
       <addDefaultImplementationEntries>true</addDefaultImplementationEntries> 
       <addDefaultSpecificationEntries>true</addDefaultSpecificationEntries> 
      </manifest> 
     </archive> 
    </configuration> 
</plugin> 

benimdir (ayrıca How to get package version at running Tomcat?

6

Maven 3'te, Kullanım Sean's answer sizin version.txt dosyası oluşturmak için inşa sırasında tezahür katacak veya mvn war:manifest

See çağırabilir Burada gösterildiği gibi, tarih ve etkin profil ile birlikte gösterilmiştir):

${project.version}-${profileID} 
${buildDate} 

ekleme özelliği 012 Çıktı aşağıdaki gibi görünür

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-resources-plugin</artifactId> 
    <version>3.0.2</version> 
    <executions> 
     <execution> 
      <id>copy-resources</id> 
      <phase>validate</phase> 
      <goals> 
       <goal>copy-resources</goal> 
      </goals> 
      <configuration> 
       <outputDirectory>${basedir}</outputDirectory> 
       <resources> 
        <resource> 
         <directory>${basedir}/target/.../[version.txt dir]/version.txt</directory> 
         <includes> 
          <include>version.txt</include> 
         </includes> 
         <filtering>true</filtering> 
        </resource> 
       </resources> 
      </configuration> 
     </execution> 
    </executions> 
</plugin> 

:

<properties> 
    <profileID>profileName</profileID> 
</properties> 

Kullanım Maven kopyalamaya karşı kaynaklar dizini örneğin ${basedir} olarak ya ${basedir}/target ulaşmak için daha kolay dosyayı kopyalamak için: profiller, örneğin her birine

1.2.3-profileName 
yymmdd_hhmm 
+0

aşağıdaki yapılandırma eklemek için gerekli, dolayısıyla bu tamamlayıcı https://stackoverflow.com/questions/5340361/replace-task-in-maven-antrun-plugin? Answertab = etkin # tab-top –

0

Tüm olasılıklar, maven-properties-plugin kullanarak .jar yapısına tüm proje özelliklerini depolamaktır.
Daha sonra bu özellikleri standart (çok pratik olmayan) Java Properties API kullanarak okuyabilirsiniz. o settings.xml dan da yayınlanan sona gerekiyordu değildir özelliklerini akabilir olarak

 <!-- Build properties to a file --> 
     <plugin> 
      <groupId>org.codehaus.mojo</groupId> 
      <artifactId>properties-maven-plugin</artifactId> 
      <version>1.0.0</version> 
      <executions> 
       <execution> 
        <phase>generate-resources</phase> 
        <goals> <goal>write-project-properties</goal> </goals> 
        <configuration> 
         <outputFile> ${project.build.outputDirectory}/build.properties </outputFile> 
        </configuration> 
       </execution> 
      </executions> 
     </plugin> 

bu yaklaşımla dikkatli olun.

0

Sean'ın cevabını eklemek için, kaynak içerisindeki targetpath parametresini kullanarak sürüm dosyasını jar içindeki bir klasör konumuna taşıyabilirsiniz. Aşağıdaki kod kavanoz ve metin dosyası (version.number) içinde sözde 'kaynaklar' bu klasörde bulunan bir klasör oluşturur.

<resource> 
    <directory>resources</directory> 
    <targetPath>resources</targetPath> 
    <filtering>true</filtering> 
    <includes> 
     <include>version.number</include> 
    </includes> 
</resource> 
<resource> 
    <directory>resources</directory> 
    <filtering>false</filtering> 
    <excludes> 
     <exclude>version.number</exclude> 
    </excludes> 
</resource> 
0

Bunu bir karınca göreviyle yaptım.

<echo file="version.txt">${project.version}</echo> 
+0

Bu tam dosyanın yerini alacaktır. –

İlgili konular