Java Maven 2:如何在WAR文件中打包当前项目版本?
我正在使用Maven 2构建我的Java项目,我正在寻找一种向用户显示pom.xml当前版本号的方法(例如使用Servlet或JSP) 就我所见,最好的方法是Maven将版本号作为文本文件打包到WAR中。这允许我从该文件中读取版本,并以我想要的方式呈现它Java Maven 2:如何在WAR文件中打包当前项目版本?,java,maven-2,version,Java,Maven 2,Version,我正在使用Maven 2构建我的Java项目,我正在寻找一种向用户显示pom.xml当前版本号的方法(例如使用Servlet或JSP) 就我所见,最好的方法是Maven将版本号作为文本文件打包到WAR中。这允许我从该文件中读取版本,并以我想要的方式呈现它 有谁知道一个插件可以为我做这样的事情吗?也许可以将WAR插件配置为这样做?或者一起使用其他方法?您正在寻找对资源进行过滤的方法。这甚至在war插件创建文件之前就已经完成了。我很确定war插件将该版本打包在web.xml和manifest中,但我
有谁知道一个插件可以为我做这样的事情吗?也许可以将WAR插件配置为这样做?或者一起使用其他方法?您正在寻找对资源进行过滤的方法。这甚至在war插件创建文件之前就已经完成了。我很确定war插件将该版本打包在web.xml和manifest中,但我不确定如何通过servlet API访问这些版本,但这可能也是一种有效的方法
看一下文档,它会告诉你是怎么做的。我认为您应该能够使用
${version}
替换版本。不过,这里还没有一个可以运行的maven安装来测试它。当然,可以在参考资料中包含变量,并通过向POM添加
标记将其设置为true,如下所示:
...
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
...
如您所见,您将在其中找到一个pom.xm
和pom.properties
文件,如中所述:
pom.xml
和pom.properties
文件打包在JAR中,因此
Maven制造的每件艺术品
是自我描述的,也允许你
在您自己的数据库中使用元数据
如有需要,可申请。一个
简单的用法可能是检索
应用程序的版本。操作
在POM文件中,您需要
使用一些Maven实用程序,但
属性可以使用
标准JavaAPI,看起来像
以下:
|-- META-INF
| |-- MANIFEST.MF
| `-- maven
| `-- com.mycompany.app
| `-- my-app
| |-- pom.properties
| `-- pom.xml
|-- WEB-INF
| |-- classes
| | |-- ...
| |-- lib
| | |-- ...
| `-- web.xml
|-- bar.jsp
|-- ...
`-- foo.jsp
#Generated by Maven
#Tue Oct 04 15:43:21 GMT-05:00 2005
version=1.0-SNAPSHOT
groupId=com.mycompany.app
artifactId=my-app
因此,您可以使用如下内容(伪代码)加载这个pom.properties
文件:
我解决这个问题的方式略有不同,因为我希望在服务的索引页上显示版本、svn修订版等。我使用buildnumber maven插件和war插件将值存储在清单中 pom.xml代码段:
org.codehaus.mojo
buildnumber maven插件
验证
创造
maven战争插件
真的
${env}
${buildNumber}
包裹
战争
${env}
将它们拉出的JSP相当简单:
健康检查
健康检查
版本:-
SVN修订版:
这显示了如下内容:
Version: 2.0.1-SNAPSHOT-QA
SVN Revision: 932
我的标准Maven WAR插件解决方案 将资源标记添加到您的构建部分,以启用筛选(也称为“搜索和替换”): 现在,当您执行“maven软件包”或maven安装时,它会将version.properties文件复制到WEB-INF/classes中,并执行搜索和替换以将pom版本添加到该文件中 要使用Java实现这一点,请使用以下类:
public class PomVersion {
final private static Logger LOGGER = LogManager.getLogger(PomVersion.class);
final static String VERSION = loadVersion();
private static String loadVersion() {
Properties properties = new Properties();
try {
InputStream inStream = PomVersion.class.getClassLoader().getResourceAsStream("version.properties");
properties.load(inStream);
} catch (Exception e){
LOGGER.warn("Unable to load version.properties using PomVersion.class.getClassLoader().getResourceAsStream(...)", e);
}
return properties.getProperty("pom.version");
}
public static String getVersion(){
return VERSION;
}
}
现在可以调用PomVersion.getVersion()将pom文件的版本号放入页面中。通过在pom.xml中的finalName中使用筛选器变量,也可以为WAR文件指定相同的编号:
<build>
<finalName>my-killer-app-${pom.version}</finalName>
...
</build>
最后,如果您大量使用Spring,例如SpringMVC/SpringWebFlow,您可以创建一个使用该类的单例服务bean,以避免按名称引用低级类:
@Service("applicationVersion")
public class ApplicationVersion {
final static String VERSION = PomVersion.getVersion();
public String getVersion() {
return VERSION;
}
}
在这些答案中,我们看到了“加载属性文件”方法的一些变体,我将用另一个可用于Maven 3.5的替代版本来补充这些变体,但可能也适用于较旧的版本
步骤0:修改pom.xml 您只需要在
pom.xml
中做一件事;启用称为资源筛选的功能。通过查找
标记并将要筛选的资源文件夹放在其中,可以轻松完成此操作。它将如下所示:
<project ...>
...
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>
...
</project>
步骤1:打开属性文件 创建一个
.properties
文件,并将其放在maven资源文件中。我将调用我的应用程序.properties
。为了简单起见,我将把它放在默认的资源文件夹中src/main/resources
但您可以将其编辑到几乎任何您想要的文件夹中
|-- pom.xml
|-- src
|-- main
|-- java
|-- webapp
|-- resources
`-- application.properties
在application.properties
文件中,我将添加所需的版本属性:
author=eFox
build=${build.version}
version=${project.version} # This is the default maven variable that you could and should use.
步骤2*.JSP页面 这就是我的方法与上述版本的不同之处。不要将属性文件作为属性类加载,而是加载META-INF
pom.properties
或将其作为控制器类,我们将把它作为资源加载:
<%@ page import = "java.util.ResourceBundle" %>
<% ResourceBundle resource = ResourceBundle.getBundle("application");
String version = resource.getString("version");
String author = resource.getString("author");%>
<html>
<head>
...
</head>
<body>
...
Site version: <%=version %> by <%=author%>
</body>
</html>
...
...
网站版本:由
谢谢。我希望你能弄明白!我刚检查过,它确实像你建议的那样工作!如果将资源的属性设置为“true”,则可以在文本文件中使用占位符。在我的例子中,占位符${version}起作用。谢谢!我不知道。感谢您的详细解释!是的,这也会起作用。但是在我的例子中,我还需要由另一个插件生成的buildNumber,可以使用${buildNumber}访问它。您的解决方案只能为我提供一个版本。哦,这不是我对您最初的问题的理解和对另一个答案的评论,但是,事实上,如果您需要更多信息,例如maven buildnumber插件()生成的${buildnumer}
,pom.properties
不会包含所有内容。这真的很有用!谢谢
@Service("applicationVersion")
public class ApplicationVersion {
final static String VERSION = PomVersion.getVersion();
public String getVersion() {
return VERSION;
}
}
<project ...>
...
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>
...
</project>
<project ...>
<properties>
<build.version>1.1-SNAPSHOT</build.version>
</properties>
...
</project>
|-- pom.xml
|-- src
|-- main
|-- java
|-- webapp
|-- resources
`-- application.properties
author=eFox
build=${build.version}
version=${project.version} # This is the default maven variable that you could and should use.
<%@ page import = "java.util.ResourceBundle" %>
<% ResourceBundle resource = ResourceBundle.getBundle("application");
String version = resource.getString("version");
String author = resource.getString("author");%>
<html>
<head>
...
</head>
<body>
...
Site version: <%=version %> by <%=author%>
</body>
</html>