Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Maven 2:如何在WAR文件中打包当前项目版本?_Java_Maven 2_Version - Fatal编程技术网

Java Maven 2:如何在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中,但我

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

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


有谁知道一个插件可以为我做这样的事情吗?也许可以将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>