【问题标题】:buildNumber plugin maven with spring boot application not working with Tomcat带有spring boot应用程序的buildNumber插件maven不能与Tomcat一起使用
【发布时间】:2016-05-19 16:09:04
【问题描述】:

我正在使用:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>buildnumber-maven-plugin</artifactId>
    <version>1.4</version>
</plugin>

使用 Spring Boot 应用程序 我将 BuildNumber 添加到 WAR 文件中的 META-INF\MANIFEST.MF 中。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-war-plugin</artifactId>
</plugin>

当我启动这个应用程序时:

java -jar MyApp.war

一切都很好。

当我在 tomcat (apache-tomcat-8.0.33) 中作为 ROOT 应用程序启动它时 - 将资源提取到 ROOT 目录(不使用 WAR 文件)应用程序无法找到我的 BuildNumber。

寻找BuildNumber的方法在这里:

@PostConstruct
private void init() {
    try {
        Enumeration<URL> resources = getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");
        while (resources.hasMoreElements()) {
            URL url = resources.nextElement();
            LOGGER.debug("Looking into URL: {} for BuildNumnber", url);
            Manifest manifest = new Manifest(url.openStream());
            Attributes mainAttributes = manifest.getMainAttributes();
            if (mainAttributes != null) {
                Object obj = mainAttributes.get(IMPLEMENTATION_BUILD);
                if (obj != null) {
                    buildNumber = obj;
                    LOGGER.info("Found P3J Build Number: " + buildNumber);
                    break;
                }
            }
        }
    } catch (Exception e) {
        LOGGER.error("Unable to determine build number. {}", e);
    }
}

有什么建议吗?

//编辑

此代码仅查看 JAR 文件中的清单 - 我的 BuildNumber 在 WAR 文件中,在 Tomcat 中它被提取到“webapps/ROOT/”中。但是仍然存在具有正确 BuildNumber 的 MANIFEST.MF 但未被此代码扫描。

如何查看Tomcat中\webapps\ROOT\META-INF\MANIFEST.MF的内容?

//编辑

answer 但是 - 现在我正在寻找如何在 Spring Boot 应用程序中做到这一点。

【问题讨论】:

  • 我认为这可能对您没有帮助,但是我们例如简单地使用 Spring-Boots banner.txt 来记录启动时的应用程序版本,这对您有用吗?它的工作原理是这样的:${AnsiColor.RED} :: ${application.title} - ${application.version} - Spring Boot${spring-boot.formatted-version} :: ${Ansi.DEFAULT}

标签: spring maven tomcat


【解决方案1】:

看起来这种方法解决了我的问题:

@RestController
@RequestMapping("/build")
public class BuildNumberResource {

@Autowired
private ServletContext servletContext;

@PostConstruct
private void init() {

    try {
        InputStream inputStream = servletContext.getResourceAsStream("/META-INF/MANIFEST.MF");
        Manifest manifest = new Manifest(inputStream);
        Attributes mainAttributes = manifest.getMainAttributes();
        if (mainAttributes != null) {
            Object obj = mainAttributes.get(IMPLEMENTATION_BUILD);
            if (obj != null) {
                buildNumber = obj;
                LOGGER.info("Found P3J Build Number in ServletContext.MANIFEST: " + buildNumber);
                return;
            }
        }
    } catch (IOException e) {
        LOGGER.error("Unable to extract BuildNumber from ServletContext. {}", e);
    }

// 编辑

似乎不再需要第二部分

    try {
        Enumeration<URL> resources = getClass().getClassLoader().getResources("META-INF/MANIFEST.MF");
        while (resources.hasMoreElements()) {
            URL url = resources.nextElement();
            LOGGER.debug("Looking into URL: {} for BuildNumnber", url);
            Manifest manifest = new Manifest(url.openStream());
            Attributes mainAttributes = manifest.getMainAttributes();
            if (mainAttributes != null) {
                Object obj = mainAttributes.get(IMPLEMENTATION_BUILD);
                if (obj != null) {
                    buildNumber = obj;
                    LOGGER.info("Found P3J Build Number: " + buildNumber);
                    return;
                }
            }
        }
    } catch (Exception e) {
        LOGGER.error("Unable to determine build number. {}", e);
    }
}

很抱歉使用 stackoverflow 作为我的橡皮鸭;)

【讨论】:

    猜你喜欢
    • 2020-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 2017-10-21
    • 2019-02-06
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    相关资源
    最近更新 更多