我有混合的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>
使用此方法,变量根据正确的版本更改每个构建,而无需向项目添加新文件。
答案 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>
使用此方法,变量根据正确的版本更改每个构建,而无需向项目添加新文件。