Soru Sürüm numarasını bir metin dosyasına çıkarmak için maven kullanma


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

DÜZENLE: İki özel meclis oluşturmak için maven Assembly Plugin ve iki açıklayıcı 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.


44
2017-08-20 15:03


Menşei




Cevaplar:


Emin. Src / main / resources içindeki bir metin dosyasını oluşturun, arayın version.txt (ya da her neyse)

Dosya içeriği:

${project.version}

şimdi, pom.xml öğesinde, yapı elemanının içinde, bu bloğu koyun:

<build>
  <resources>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>true</filtering>
      <includes>
        <include>**/version.txt</include>
      </includes>
    </resource>
    <resource>
      <directory>src/main/resources</directory>
      <filtering>false</filtering>
      <excludes>
        <exclude>**/version.txt</exclude>
      </excludes>
    </resource>
    ...
  </resources>
</build>

Her derlemeden sonra, dosya (hedef / sınıfta bulabileceğiniz) geçerli sürümü içerecektir.

Şimdi dosyayı otomatik olarak başka bir yere taşımak istiyorsanız, muhtemelen bir karınca görevi yürütmeniz gerekecek. Maven-antrun-eklentisi.

Böyle bir ş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>

77
2017-08-20 15:18



Bazı nedenlerden dolayı, ilk blok, sürümü hedef / sınıflara yerleştirmiyor. Version.txt dosyasını oluşturursam ikinci kod bloğu çalışır gibi görünüyor. - sanz
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) :-) - Sean Patrick Floyd
@SeanPatrickFloyd neden filtrelemeye ihtiyacım olduğunu açıklar mısınız = dışlama ve filtreleme için false = ekler için doğrudur? Ne anlama geliyor? - Karussell
@Karussell, her kaynağı filtrelemek istemediğinizde, biri filtrelemeli olmak üzere iki ayrı çalıştırmaya ihtiyacınız olduğu anlamına gelir. ve koşulardan birinde yer alan şey, açıkça, diğerinde hariç tutulmalıdır. - Sean Patrick Floyd
dosyayı tamamen ayrı bir işlemle taşımak zorunda değilsiniz. Belirtebilirsiniz <targetPath>. - Adam


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

.War için bu yapılandırmayı kullanın:

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

Bu, yapı sırasında manifesto ekleyecek veya mvn war:manifest

Ayrıca bakınız Tomcat'i çalıştırarak paket sürümü nasıl edinilir?


11
2018-03-11 03:09





Ne demek istiyorsun süzme

Belirli bir kaynak üzerinde filtrelemeyi etkinleştirmeniz ve ardından kullanmanız gerekir. ${project.version} yapınızın bir parçası olarak yerini alacak


10
2017-08-20 15:16





Bir sürüm bilgisi dosyası oluşturmak için bir Groovy komut dosyasını da 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.

Bu nedenle, pom.xml dosyasında, bu gibi bir dosya oluşturucu groovy betiğine sahip olursunuz:

  <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 daha sonra montaj eklentisi eklentisi pom.xml'de şöyle görünür:

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

Ve sonunda derleme tanımlayıcınız dist-all.xml şöyle görünürdü:

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

7
2017-08-12 07:08





Maven 3, Kullanımda Sean'ın cevabı oluşturmak için version.txt dosya, (benimki burada, tarih ve etkin profil ile birlikte gösterilir):

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

özellik ekleyerek profileID profillerin her birine, örn .:

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

Dosyayı kopyalamak için Maven kopya kaynaklarını kullanın. ${basedir} veya ${basedir}/target:

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

çıktı böyle görünüyor:

1.2.3-profileName
yymmdd_hhmm

6
2018-06-30 22:35



Aşağıdaki yapılandırmayı eklemem gerekiyordu, dolayısıyla bu tamamlayıcıdır: <configuration> <sınırlayıcılar> <sınırlayıcı> $ {*} </ sınırlayıcı> </ sınırlayıcılar> </ yapılandırma> Aşağıdaki postada belirtildiği gibi: stackoverflow.com/questions/5340361/... - grails-coder


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

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

1
2017-07-10 22:05



Bu tam dosyanın yerini alacak. - Jerad Rutnam


Bir olasılık tüm proje özelliklerini yerleşik olarak depolamaktır. .jar kullanma maven-properties-plugin.
Daha sonra bu özellikleri standart kullanarak (çok pratik olmasa da) okuyabilirsiniz. Java Özellikleri API'sı.

        <!-- 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şıma dikkat edin, çünkü yayınlanmaması gereken özellikler sızıntısı olabilir. settings.xml.


0
2018-04-23 11:32