在编译时将项目版本插入scala代码

时间:2016-01-03 09:21:02

标签: java scala maven

我有混合的Java / Scala项目,我使用Maven作为构建工具,我在pom.xml文件中提到了我的项目版本:

<parent>
    <groupId>com</groupId>
    <artifactId>stuff</artifactId>
    <version>3.6.7.7-SNAPSHOT</version>
</parent>

<plugin>
    <groupId>net.alchim31.maven</groupId>
    <artifactId>scala-maven-plugin</artifactId>
    <version>3.2.0</version>
    <executions>
            <execution>
                <id>scala-compile</id>
                <goals>
                    <goal>compile</goal>
                </goals>
            </execution>
    </executions>
</plugin>

我想在我的scala代码中使用项目版本(3.6.7.7-SNAPSHOT),这意味着我需要在编译过程中以某种方式注入它,有没有办法做到这一点?

已经尝试使用getProperty函数 -

val properties = System.getProperties()
override def version: String = properties.get("parent.version")

但它返回null。

编辑 - 我发现了类似question的Java代码。

我决定使用maven-replacer-plugin

            <plugin>
            <groupId>com.google.code.maven-replacer-plugin</groupId>
                <artifactId>maven-replacer-plugin</artifactId>
                <version>1.4.0</version>
                <executions>                
                    <execution>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>replace</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <file>.\src\main\resources\Installer.scala</file>
                    <outputFile>.\src\main\scala\com\Installer.scala</outputFile>
                    <replacements>
                        <replacement>
                            <token>@pomversion@</token>
                            <value>${project.version}</value>
                        </replacement>
                    </replacements>                        
                </configuration>
        </plugin>

但缺点是我必须在资源目录中创建一个新文件,有没有什么方法可以在编译后将类返回到其原始状态,即使在编译失败的情况下也是如此?

解决 - 我使用正则表达式maven-replacer-plugin,找到定义版本变量的行,并使用 -

更改它的值
            <plugin>
            <groupId>com.google.code.maven-replacer-plugin</groupId>
                <artifactId>maven-replacer-plugin</artifactId>
                <version>1.4.0</version>
                <executions>                
                    <execution>
                        <phase>process-sources</phase>
                        <goals>
                            <goal>replace</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <file>.\src\main\scala\com\Installer.scala</file>
                    <outputFile>.\src\main\scala\com\Installer.scala</outputFile>
                    <replacements>
                        <replacement>
                            <token>override def version: String = (.*)</token>
                            <value>override def version: String = "${project.version}"</value>
                        </replacement>
                    </replacements>                        
                </configuration>
        </plugin>

使用此方法,变量根据正确的版本更改每个构建,而无需向项目添加新文件。

2 个答案:

答案 0 :(得分:2)

您可以使用maven资源插件执行此操作。

details.txt文件放在src/main/resources

details.txt内容

project.version=${project.version}

现在在POM中使用以下插件

<plugin>
    <artifactId>maven-resources-plugin</artifactId>
    <version>2.7</version>
    <executions>
        <execution>
            <id>copy-resources</id>
            <phase>validate</phase>
            <goals>
                <goal>copy-resources</goal>
            </goals>
            <configuration>
                <outputDirectory>${basedir}</outputDirectory>
                <resources>
                    <resource>
                        <directory>${project.build.directory}/details.txt</directory>
                        <includes>
                            <include>version.txt</include>
                        </includes>
                        <filtering>true</filtering>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

这将使用project.version值写入details.txt。您也可以获得任何其他变量值。

现在,因为details.txt是你构建的一部分,所以阅读它的内容是微不足道的。

答案 1 :(得分:0)

已解决 - 我使用正则表达式和maven-replacer-plugin,位于定义版本变量的行,并使用 -

更改它的值
        <plugin>
        <groupId>com.google.code.maven-replacer-plugin</groupId>
            <artifactId>maven-replacer-plugin</artifactId>
            <version>1.4.0</version>
            <executions>                
                <execution>
                    <phase>process-sources</phase>
                    <goals>
                        <goal>replace</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <file>.\src\main\scala\com\Installer.scala</file>
                <outputFile>.\src\main\scala\com\Installer.scala</outputFile>
                <replacements>
                    <replacement>
                        <token>override def version: String = (.*)</token>
                        <value>override def version: String = "${project.version}"</value>
                    </replacement>
                </replacements>                        
            </configuration>
    </plugin>

使用此方法,变量根据正确的版本更改每个构建,而无需向项目添加新文件。