嗨,我试图从我的pom.xml中获取工件版本号,以便在这个典型的about & license信息窗口中使用它。本质上,我实现了Retrieve version from maven pom.xml in code中给出的可接受的解决方案,并且为了解决其中一条评论中提出的关于过滤其他资源文件的问题,我将版本信息分离在一个目录中,而所有其他信息都在常规位置。在pom文件中,它看起来像这样:
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/resources/versions</directory>
<filtering>true</filtering>
<includes>
<include>**/version.properties</include>
</includes>
</resource>
</resources>
我在Eclipse中使用mvn clean javafx:run
构建了它
好消息:它起作用了。
坏消息:有意想不到的副作用:在我的 target/classes 目录和 target/classes/versions 中,我都有 * version.properties * 文件。target/classes/versions 中的一个仍然包含原始的version=${project.version}
语句,而 target/classes 中的一个仍然包含预期的version=1.0.0
语句。我为什么要抱怨?我只期望在 target/versions 中有一个包含version=1.0.0
语句的文件。
有人能解释一下为什么我在目标树中得到两个文件,以及是否有一种更干净的方法,比如我有,像现在这样,一个属性源文件在 src/main/resources 分支的某个地方-而不干扰其他资源文件-并且只有一个结果属性文件在目标树的某个地方,具有pom工件版本id?
先谢谢你了。
也许你需要整个pom?
<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>de.aname</groupId>
<artifactId>sifuSays</artifactId>
<version>1.0.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<repositories>
<repository>
<id>jcenter</id>
<name>jcenter-bintray</name>
<url>https://jcenter.bintray.com</url>
</repository>
</repositories>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>libraries-bom</artifactId>
<version>26.19.0</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<!-- JavaFX -->
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>19</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>19</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-media</artifactId>
<version>19</version>
</dependency>
<!-- JAXB API only -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>4.0.3</version>
<scope>runtime</scope>
</dependency>
<!-- Framegrabber to get image from movies -->
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>javacv</artifactId>
<version>1.5.9</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>ffmpeg-platform</artifactId>
<version>6.0-1.5.9</version>
</dependency>
<dependency>
<groupId>org.bytedeco</groupId>
<artifactId>flandmark</artifactId>
<version>1.07-1.5.5</version>
</dependency>
<!--https://mvnrepository.com/artifact/com.google.cloud/google-cloud-texttospeech -->
<dependency>
<groupId>com.google.cloud</groupId>
<artifactId>google-cloud-texttospeech</artifactId>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
</resource>
<resource>
<directory>src/main/resources/versions</directory>
<filtering>true</filtering>
<includes>
<include>**/version.properties</include>
</includes>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.11.0</version>
<configuration>
<source>11</source>
<target>11</target>
<release>11</release>
</configuration>
</plugin>
<plugin>
<groupId>org.openjfx</groupId>
<artifactId>javafx-maven-plugin</artifactId>
<version>0.0.8</version>
<executions>
<execution>
<!-- Default configuration for running -->
<!-- Usage: mvn clean javafx:run -->
<id>default-cli</id>
<configuration>
<mainClass>de.aname.sifuSays.App</mainClass>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>3.3.0</version>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>de.aname.sifuSays.AppLauncher</mainClass>
</manifest>
</archive>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>3.5.0</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
<configuration>
<outputFile>${dir}/${project.artifactId}.jar</outputFile>
<createDependencyReducedPom>false</createDependencyReducedPom>
<transformers>
<transformer
implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
<mainClass>de.aname.sifuSays.AppLauncher</mainClass>
</transformer>
</transformers>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
2条答案
按热度按时间atmip9wb1#
您链接到Maven documentation that explains how to do this的问题的答案
把那些不应该过滤的文件放到src/main/resources中,把其他文件放到src/main/resources-filtered中
因此,过滤后的版本属性的源应该位于src/main/resources-filtered下,而不是src/main/resources(或其下的任何目录)。
您还需要调整pom中的资源定义,以匹配本答案中提到的名称。链接的Maven文档将逐步告诉您如何做到这一点。
ix0qys7i2#
现在,
versions
目录包含在两个<resource>
元素中。所以它出现了两次。这也是为什么target/classes/versions
中的文件未被过滤(由第一个<resource>
元素处理),而target/classes
中的文件被过滤(由第二个<resource>
元素处理)的原因。我还没有尝试过,但是如果你从第一个
<resource>
元素中排除versions
文件夹,你可能会得到你想要的结果--在target/classes
中只有一个版本文件的副本,并应用了过滤。如果您想将文件放在target/classes/versions
中,请阅读jewelsea's answer