Maven 2:如何在WAR文件中打包当前项目版本?

我正在使用Maven 2来构建我的Java项目,我正在寻找一种方法来向用户呈现pom.xml的当前版本号(例如,使用Servlet或JSP)。

据我所知,最好的方法是Maven将版本号作为文本文件打包到WAR中。 这允许我从该文件中读取版本并以我想要的方式呈现它。

有谁知道一个插件可以为我做这样的事情? 也许WAR插件可以这样配置? 或者也许一起使用其他方法?

你想要过滤资源。 甚至在war-plugin创建文件之前就已经完成了。 我很确定war-plugin在web.xml和manifest中包含了这个版本,但是我不确定如何通过servlet API访问它们,但它也可能是一种有效的方法。

看看Maven资源插件文档,它会告诉你它是如何完成的。 我认为您应该能够使用${version}替换该版本。 虽然没有工作的maven安装在这里测试它。

我有点不同地解决了这个问题,因为我希望在服务的索引页面上显示版本,svn修订版等。 我使用buildnumber-maven-plugin和war-plugin将值存储在清单中。

pom.xml片段:

  org.codehaus.mojo buildnumber-maven-plugin   validate  create      maven-war-plugin    true   ${env} ${buildNumber}      package  war   ${env}     

将它们拉出来的JSP相当简单:

 <%@ page language="java" pageEncoding="UTF-8"%> <% java.util.jar.Manifest manifest = new java.util.jar.Manifest(); manifest.read(pageContext.getServletContext().getResourceAsStream("/META-INF/MANIFEST.MF")); java.util.jar.Attributes attributes = manifest.getMainAttributes(); %>    Health Check   

Health Check

Version: <%=attributes.getValue("Implementation-Version")%>-<%=attributes.getValue("Implementation-Environment")%>

SVN Revision: <%=attributes.getValue("Implementation-Build")%>

这显示如下:

 Version: 2.0.1-SNAPSHOT-QA SVN Revision: 932 

我的标准Maven WAR插件的解决方案

向您构建部分添加资源标记,该部分启用过滤(也称为“搜索和替换”):

    src/main/resources true   ....  

然后在你的src / main / resources中添加一个version.properties文件,其中包含与标准maven构建变量之一匹配的任何过滤变量(你也可以使用过滤function来加载你自己的自定义变量):

 pom.version=${pom.version} 

现在,当您执行“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中的filter变量为WAR文件指定相同的编号:

  my-killer-app-${pom.version} ...  

所以现在如果你在pom中设置你的应用程序版本是01.02.879:

  4.0.0 com.killer.app my-killer-app war This App Will Rule The World 01.02.879 ...  

当您执行“mvn install”时,war文件名也包含版本号:

 my-killer-app-01.02.879.war 

最后,如果您使用Spring,例如使用SpringMVC / SpringWebFlow,您可以创建一个使用该类的单例服务bean,以避免必须按名称引用低级类:

 @Service("applicationVersion") public class ApplicationVersion { final static String VERSION = PomVersion.getVersion(); public String getVersion() { return VERSION; } } 

当然,变量可以包含在资源中,并通过在POM中添加标记并将其设置为true来 maven-resource-plugin,如下所示:

 ...  src/main/resources true  ... 

并且您可以使用此function来读取和替换属性文件中的${version} (或${project.version}${pom.version}等效)。

但是,实际上,默认情况下Maven可以提供您正在查找的信息(除非您将其配置为不这样做,如果您不知道这一点,这是不太可能的)。 如果您解压缩Maven为您创建的WAR并查看它,您会看到以下内容:

 |-- META-INF | |-- MANIFEST.MF | `-- maven | `-- com.mycompany.app | `-- my-app | |-- pom.properties | `-- pom.xml |-- WEB-INF | |-- classes | | |-- ... | |-- lib | | |-- ... | `-- web.xml |-- bar.jsp |-- ... `-- foo.jsp 

如您所见,您将在其中找到pom.xmpom.properties文件,如我如何向JAR添加资源中所述? :

pom.xmlpom.properties文件打包在JAR中,以便Maven生成的每个工件都是自描述的,并且还允许您在需要时利用自己应用程序中的元数据。 一个简单的用途可能是检索应用程序的版本。 在POM文件上操作需要使用一些Maven实用程序,但可以使用标准Java API来使用这些属性,如下所示:

 #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文件(伪代码):

 // Retrieve resource InputStream is = getClass().getResourceAsStream( "/META-INF/maven/com.mycompany.app/my-app/pom.properties" ); // Do something with the resource, eg load it as Properties Properties prop = new Properties(); prop.load(is); String version = prop.getProperty("version"); 

在这些答案中,我们看到了“加载属性文件”方法的一些变体,我将使用另一个与Maven 3.5一起使用的替代版本附加到该版本,但也可能与旧版本一起使用。

第0步pom.xml

你只需要在pom.xml做一件事; 打开一个叫做资源过滤的东西。 通过查找标记并将要过滤的资源文件夹放在那里,可以轻松完成此操作。 它将如下所示:

  ...    src/main/resources true   ...  ...  

注意:省略号...表示代码被省略

如果您愿意,您也可以添加自定义变量,但这不是必需的

   1.1-SNAPSHOT  ...  

第1步属性文件

创建.properties文件并将其放在maven资源文件中。 我打算叫我的application.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页面

这是我的方法与上述版本不同的地方。 不是将属性文件作为Property类加载,而是加载META-INF pom.properties或将其作为控制器类,我们将把它作为资源加载:

 <%@ page import = "java.util.ResourceBundle" %> <% ResourceBundle resource = ResourceBundle.getBundle("application"); String version = resource.getString("version"); String author = resource.getString("author");%>   ...   ... Site version: <%=version %> by <%=author%>