【问题标题】:JSF how to show pom.xml version in my app?JSF 如何在我的应用程序中显示 pom.xml 版本?
【发布时间】:2013-01-30 19:11:49
【问题描述】:

我正在尝试在 JSF 中重写旧版应用程序,而其他已重写的应用程序已在页脚中发布了 maven 版本。

我正在试图弄清楚他们是如何做到的,到目前为止,这是我发现他们正在做的事情:

页脚.xhtml

<h:outputText id="fullBuildString" value="#{ApplicationInfo.fullBuildString}" />

ApplicationInfoBacking.java

public class ApplicationInfoBacking {

    private String             buildTime;
    private String             iteration;
    private String             version;
    private String             inception;
    private String             fullBuildString;

    @PostConstruct
    public void init() {
        fullBuildString = generateFullBuildString();
    }

    public String getBuildTime() {
        return buildTime;
    }

    public void setBuildTime(final String buildTime) {
        this.buildTime = buildTime;
    }

    public String getIteration() {
        return iteration;
    }

    public void setIteration(final String iteration) {
        this.iteration = iteration;
    }

    public String getVersion() {
        return version;
    }

    public void setVersion(final String version) {
        this.version = version;
    }

    public String getInception() {
        return inception;
    }

    public void setInception(final String inception) {
        this.inception = inception;
    }

    /**
     * @return ApplicationName vVersion (Iteration) BuildTime
     */
    public String getFullBuildString() {
        return fullBuildString;
    }

    public String generateFullBuildString() {

        if ((version == null) || "".equals(version.trim())) {
            version = "Unknown version";
        }

        if ((iteration == null) || "".equals(iteration.trim())) {
            iteration = "Unknown iteration";
        }

        if ((buildTime == null) || "".equals(buildTime.trim())) {
            buildTime = "Unknown build time";
        }

        final StringBuilder build = new StringBuilder();
        build.append("v. ").append(version);

        if (!Phase.PRODUCTION.equals(PlatformUtil.getPhase()) && !Phase.BETA.equals(PlatformUtil.getPhase())) {
            build.append(" (").append(iteration).append(")");
            build.append(" ").append(buildTime);
        }

        return build.toString();
        }
}

faces-config.xml

<managed-bean>
        <managed-bean-name>ApplicationInfo</managed-bean-name>
        <managed-bean-class>path.to.class.ApplicationInfoBacking</managed-bean-class>
        <managed-bean-scope>application</managed-bean-scope>
        <managed-property>
            <property-name>buildTime</property-name>
            <value>#{initParam.buildTime}</value>
        </managed-property>
        <managed-property>
            <property-name>iteration</property-name>
            <value>#{initParam.iteration}</value>
        </managed-property>
        <managed-property>
            <property-name>version</property-name>
            <value>#{initParam.version}</value>
        </managed-property>
        <managed-property>
            <property-name>inception</property-name>
            <value>#{initParam.inception}</value>
        </managed-property>
    </managed-bean>

web.xml

<context-param>
        <param-name>buildTime</param-name>
        <param-value>${buildNumber}</param-value>
    </context-param>
    <context-param>
        <param-name>iteration</param-name>
        <param-value>${iteration}</param-value>
    </context-param>
    <context-param>
        <param-name>version</param-name>
        <param-value>${pom.version}</param-value>
    </context-param>

这是我加载应用程序时实际显示的内容:

v. ${pom.version}

由于某种原因,${pom.version} 没有得到解释。

有人知道为什么吗?

【问题讨论】:

    标签: java jsf maven


    【解决方案1】:

    看起来他们正在使用 buildnumber 插件:http://mojo.codehaus.org/buildnumber-maven-plugin/

    您需要将其添加到您的 web 模块,然后通过 pom.xml 中的资源部分启用 web.xml 过滤 - 我认为 faces-config 不需要更改。我不知道你可以使用 initParam。 如果你不能,你仍然可以直接过滤 faces-config,以防你的 IDE 不喜欢过滤 web.xml

    “pom.version”可能无法正常工作,因为它已被弃用?尝试使用 project.version

    【讨论】:

    • 您能解释一下“通过 pom.xml 中的资源部分启用 web.xml 过滤”是什么意思吗?
    • 我在父 pom 中注意到正在使用此插件。我从来不知道它做了什么。谢谢。
    • 如果你想替换属性/占位符,你需要打开默认关闭的过滤。有关一些示例,请参阅maven.apache.org/plugins/maven-resources-plugin/examples/…。通常您包含 .xml 文件进行过滤,但不希望图像也被过滤(它们会被损坏)。因此,您配置了两次相同的文件夹,一次是过滤复制图像,一次是过滤复制 xml 文件。您还可以排除所有文件,然后包含特定文件。我认为该链接提供了有关如何使用过滤的很好示例。
    【解决方案2】:

    拥有来自不同属性文件的 maven pom 键

    在应用启动时读取属性文件并将其放入应用范围的bean中

    【讨论】:

    • 如果可能的话,我真的很想模仿目前存在的东西。除了我的 pom.xml 文件之外,我不想更改另一个文件中的版本号。
    • 然后只需解析 pom.xml 文件或查找清单文件,它也应该具有易于解析的版本,只需从中构造属性即可
    • 您能否提供一个示例,说明如何从清单文件中提取版本?
    • 这是一个潜在的解决方案,但我想我真的在寻找关于为什么 ${pom.version} 没有被解释的答案。
    【解决方案3】:

    pom.version 不会被解释,因为在运行时没有 pom 之类的东西。仅当 Maven 读取 pom 并创建模型时,pom.xml 才会在构建时作为项目设置的 Java 对象树存在于内存中。在运行时 Maven 没有运行所以 pom.version 没有价值。 pom.* 也已弃用.. 它应该是 project.*

    为了做你想做的事,请使用其他答案中提出的解决方案..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-27
      • 2021-08-29
      • 2021-04-14
      • 2021-01-28
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      相关资源
      最近更新 更多