簡體   English   中英

Java文件中的Maven版本號

[英]Maven Version number in java file

我來自ANT,您可以通過執行某種方法調用.java文件來獲取版本號。 我想在我的新pom.xml中做類似的事情來自動獲取正確的版本號。 我需要應用程序了解它自己的版本,同時Maven知道版本得到了正確的版本。 持有版本infomormation加倍是沒有選擇。

或者Maven可以在構建期間/之前創建一個新的.java文件嗎?

我可以想象很多方法來實現這個目標,但是在Maven項目中有沒有最佳實踐方法呢?

構建JAR時,Maven將pom.xmlpom.properties文件寫入META-INF/maven/[group ID]/[artifact ID]目錄。 然后,您可以在應用程序中讀取其中一個版本。

或者,您可以使用資源篩選顯式編寫新的version.properties文件。

如果您在POM中放入以下內容:

<build>
    <resources>
        <resource>
            <directory>src/main/resources</directory>
            <filtering>true</filtering>
        </resource>
    </resources>
</build>

然后將version.properties模板放入src / main / resources目錄,如下所示:

version = ${project.version}

Maven將替換POM中讀取的version.properties ,然后您的應用程序只需要讀取version.properties資源並查詢version密鑰。

我將在SO上向您推薦這個帖子: 如何在Maven中讀取外部屬性文件 特別是,請查看Dougnukem的答案,該答案描述了如何將外部屬性文件讀入Maven。 您可以將其用作共享源,以控制Maven構建腳本和Java應用程序中的版本號。

也許如果你詳細說明這個要求,我們可以幫助更多地為你的問題提供更優雅的mavenish解決方案。 Nmely,這個第二個應用程序是什么,它是從Maven啟動的,如果是這樣的話,它在構建過程的哪個階段啟動了? 這個應用程序和Maven有什么交互?

有很多方法可以實現,但選擇正確的方法在很大程度上取決於您的具體情況,您的問題中沒有足夠的信息可以深入挖掘更全面的解決方案。 也就是說,以下是我的想法:

  • 外部屬性 :您可以在外部或直接從Maven構建過程創建屬性文件。 然后,您可以從其他應用程序中讀取此屬性文件。

  • 過濾:正如其他人提到的那樣,可以讓Maven過濾資源文件。 此文件可以是您插入當前版本號的java文件,並從您的其他應用程序調用此文件。

  • 從Maven構建中調用您的應用程序並傳遞參數:您可以使用exec插件並將您的應用程序作為Maven的子流程調用,並傳遞當前版本號$ {project.version}。

  • 在Maven中集成您的舊Ant構建:您可以直接調用一些Ant片段或從Maven完成ant構建。 這將為您提供一個混合構建系統,這可能不是最好的,但仍然可以讓您在遷移過程中有一些余地,並管理較舊的Ant腳本,將一小部分功能遷移到Maven。 並不是說兩者混合在一起並不一定是壞事,只是Maven提供了許多Ant腳本可能干擾的硬連線或准硬連線配置約定。 在這方面,兩者都很難相處。

  • 螞蟻驅動你的Maven構建:你也可以做相反的事情,即從螞蟻驅動Maven構建過程,從而控制你如何調用你的其他系統。 通過集成正確的東西(例如屬性或過濾器),您可以確保Maven從特定項目中生成必要的工件,您可以在以后的Ant腳本中使用該工件。 請注意,此任務的文檔不是很復雜,您可能需要稍微調整一下才能使其工作,但至少您將處於熟悉的環境中。

如果沒有關於這兩個系統如何相互作用的更多信息以及為什么需要這些信息,那么很難為您深入挖掘。

希望這可以幫助

我意識到很久以前就已經回答了這個問題,但是我已經想出了一些有些可能會有用的答案。

我有替換器插件在每個MAVEN構建的Java文件中更改一個字符串。 因此,如果pom.xml更新了pom項目版本號,它將自動反映在java源文件中。

replace目標:

<build>
    ...
    <pluginManagement>
        <plugins>
            <!--This plugin's configuration is used to store Eclipse m2e settings only. It has no influence on the Maven build itself.-->
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>
                                        com.google.code.maven-replacer-plugin
                                    </groupId>
                                    <artifactId>
                                        replacer
                                    </artifactId>
                                    <versionRange>
                                        [1.5.3,)
                                    </versionRange>
                                    <goals>
                                        <goal>replace</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <execute />
                                    <runOnIncremental>true</runOnIncremental>
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
    ...
</build>

要求填寫當前名稱和版本:

(如果您願意,請將完整的子路徑放在basedir並從包含的文件名中刪除**/ 。)

<build>
    ...
    <plugins>
        <plugin>
            <groupId>com.google.code.maven-replacer-plugin</groupId>
            <artifactId>replacer</artifactId>
            <version>1.5.3</version>
            <executions>
                <execution>
                    <id>replace-version-number</id>
                    <phase>generate-sources</phase>
                    <goals>
                        <goal>replace</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <basedir>${project.basedir}/src/main/java</basedir>
                <includes>
                    <include>**/Constants.java</include>
                </includes>
                <preserveDir>true</preserveDir>
                <replacements>
                    <replacement>
                        <token>mavenProjectName = ".*"</token>
                        <value>mavenProjectName = "${project.name}"</value>
                    </replacement>
                    <replacement>
                        <token>mavenProjectVersion = ".*"</token>
                        <value>mavenProjectVersion = "${project.version}"</value>
                    </replacement>
                </replacements>
            </configuration>
        </plugin>
        ....
    </plugins>
    ...
</build>

IN Constants.java:

...
private static final String mavenProjectName = "";
private static final String mavenProjectVersion = "";
...

在編譯階段之前,這些值將在generate_sources階段填充POM的值。

替換器令牌中的通配符.*表示即使您將更新的副本檢查到源代碼管理中,該值也會更新。

不清楚你指的是什么版本號,為什么它會在java文件中。 但是,如果您嘗試為項目分配版本號,請遵循標准Maven約定。 這是一個例子:

<project xmlns="http://maven.apache.org/POM/4.0.0"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.myco.abc</groupId>
  <artifactId>myapp</artifactId>
  <packaging>war</packaging>
  <version>1.0.0-SNAPSHOT</version>

  <name>My App</name>
  <description>My application description.</description>
  <url>http://myapp.myco.com</url>
....

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM