请帮助我找出为什么我无法从METAINF.MF文件中读取所需的信息。 我的build-gradle文件如下所示:
plugins {
id 'org.springframework.boot' version '2.1.6.RELEASE'
id 'java'
}
tasks.register("incrementVersion") {
doFirst {
def ver = version
println ver
String lastNumber = ver.substring(ver.lastIndexOf('.') + 1)
int increment = lastNumber.toInteger() + 1
println increment
String firstNumber = ver.substring(0, ver.lastIndexOf("."))
println firstNumber
String result = buildFile.getText().replaceFirst("version='$version'","version='" + firstNumber + "." + increment + "'")
buildFile.setText(result)
}
}
build.dependsOn incrementVersion
apply plugin: 'io.spring.dependency-management'
bootJar {
doFirst {
manifest {
attributes(
'Main-Class': 'com.example.appinfo.AppinfoApplication',
'Implementation-Title': 'Lalala',
'Implementation-Version': "${version}"
)
}
}
}
group = 'com.example'
version='version 0.0.2'
sourceCompatibility = '1.8'
repositories {
mavenCentral()
}
springBoot {
buildInfo()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-web-services'
runtimeOnly 'org.postgresql:postgresql'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
我正在使用SpringBoot版本2.1.6
我需要获取数据(实现版本)并以Java代码进行解析。 我为此创建了一些逻辑。例如 版本1:
protected static String getManifestInfo() {
Enumeration resEnum;
try {
resEnum = Thread.currentThread().getContextClassLoader().getResources(JarFile.MANIFEST_NAME);
while (resEnum.hasMoreElements()) {
try {
URL url = (URL)resEnum.nextElement();
InputStream is = url.openStream();
if (is != null) {
Manifest manifest = new Manifest(is);
Attributes mainAttribs = manifest.getMainAttributes();
String version = mainAttribs.getValue("Implementation-Version");
if(version != null) {
return version;
}
}
}
catch (Exception e) {
// Silently ignore wrong manifests on classpath?
}
}
} catch (IOException e1) {
// Silently ignore wrong manifests on classpath?
}
return null;
}
或版本2:
public static String readManifestData() {
Manifest mf = new Manifest();
try {
mf.read(Thread.currentThread().getContextClassLoader().getResourceAsStream("META-INF/MANIFEST.MF"));
} catch (IOException e) {
e.printStackTrace();
}
Attributes atts = mf.getMainAttributes();
return atts.getValue("Implementation-Version");
}
我正在开票。 然后,我检查MANIFEST.MF文件,以确保存在所需的版本。一切正常。
Manifest-Version: 1.0
Implementation-Title: Lalala
Implementation-Version: version 0.0.1
Start-Class: com.example.appinfo.AppinfoApplication
Spring-Boot-Classes: BOOT-INF/classes/
Spring-Boot-Lib: BOOT-INF/lib/
Spring-Boot-Version: 2.1.6.RELEASE
Main-Class: com.example.appinfo.AppinfoApplication
然后我检查生成的War(或Jar)文件。我确保它也具有MANIFEST.MF文件,并且内容完全相同。
然后,当我启动应用程序时,我从该MANIFEST.MF文件中仅获得2个属性:这是 “ Created-By”和“ Manifest-Version”。
这是一种疯狂。在清单文件中,有更多数据,而我只有2。 而且清单文件中没有更多参数“创建者”。 我想从清单文件中获取“实施版本” 参数。
请谁帮助我们了解原因? 谢谢。