在编译时将项目版本插入到 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>
使用此方法,变量会根据正确的版本更改每个构建,而无需向项目添加新文件。
我混合了 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>
使用此方法,变量会根据正确的版本更改每个构建,而无需向项目添加新文件。