无法从MANIFEST.MF文件SpringBoot获取数据

时间:2019-07-26 07:52:29

标签: java spring-boot gradle gradle-plugin manifest.mf

请帮助我找出为什么我无法从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。 而且清单文件中没有更多参数“创建者”。 我想从清单文件中获取“实施版本” 参数。

请谁帮助我们了解原因? 谢谢。

0 个答案:

没有答案