我正在使用:
<plugin>
<groupId>org.codehaus.mojo</groupId>
<artifactId>buildnumber-maven-plugin</artifactId>
<version>1.4</version>
</plugin>
使用弹簧启动应用程序我正在将BuildNumber添加到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) 中启动它时,作为根应用程序 - 将资源提取到根目录(不使用 WAR 文件)应用程序无法找到我的内部版本号。
寻找内部版本号的方法在这里:
@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文件中的清单 - 我的内部版本号在WAR文件中,在Tomcat中它被提取到"webapps/ROOT/"中。但仍然有明显的。具有正确内部版本号的MF,但此代码未扫描。
如何检查 \webapps\ROOT\META-INF\MANIFEST 的内容。雄猫中的MF?
//编辑
有答案,但是 - 现在我正在寻找如何在 Spring 启动应用程序中做到这一点。
看起来这种方法解决了我的问题:
@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);
}
}
很抱歉使用堆栈溢出作为我的橡皮鸭;)