在编译时将项目版本插入到 Scala 代码中

Insert Project version to scala code in compile time

我混合了 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")

但它 return 无效。

edit- 我为 Java 代码找到了类似的 question

我决定使用 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>

但缺点是我必须在资源目录中创建一个新文件,有什么办法可以 return 编译后 class 恢复到原来的状态,即使在编译失败的情况?

已解决- 我将正则表达式与 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>

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

您可以使用 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 是您构建的一部分,阅读它的内容就很简单了。

已解决 - 我将正则表达式与 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>

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