Расхождение между тем, что содержит Манифест, когда я открываю zip, и тем, что возвращает Java - PullRequest
0 голосов
/ 26 апреля 2018

Я создаю Jar, содержащий банки, используя Ant.

Извлечение из скрипта Ant:

 <target name="create_run_jar">
        <tstamp><format property="buildTime" pattern="yyyy/MM/dd hh:mm:ss"/></tstamp>
        <jar destfile="${dir.jarfile}/MyJar.jar">
            <manifest>
                <attribute name="Main-Class" value="org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader"/>
                <attribute name="Rsrc-Main-Class" value="com.qantas.Converter"/>
                <attribute name="Class-Path" value="."/>
                <attribute name="Rsrc-Class-Path" value="./ java-getopt-1.0.12.jar jug.jar log4j-1.2.15.jar xom-1.2.6.jar junit.jar org.hamcrest.core_1.3.0.v201303031735.jar cupv10k-runtime.jar org.eclipse.wst.xml.xpath2.processor_1.1.0.jar xml-apis.jar serializer.jar xercesImpl.jar xercesSamples.jar"/>
                <attribute name="Build-Time" value=" ${buildTime}"/>
            </manifest>
            <zipfileset src="jar-in-jar-loader.zip"/>
            <fileset dir="${dir.buildfile}/target/classes"/>
            <fileset dir="${dir.buildfile}/target/test-classes"/>
            <zipfileset dir="${dir.buildfile}/third_party_jars" includes="java-getopt-1.0.12.jar"/>

Когда я генерирую файл jar и открываю его, я вижу:

Верхний уровень в файле Jar:

enter image description here

Файл в файле META-INF / MANIFEST.MF содержит то, что я ожидаю:

Manifest-Version: 1.0
Ant-Version: Apache Ant 1.9.6
Created-By: 1.8.0_111-b14 (Oracle Corporation)
Main-Class: org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader
Rsrc-Main-Class: com.qantas.Converter
Rsrc-Class-Path: ./ java-getopt-1.0.12.jar jug.jar log4j-1.2.15.jar xo
 m-1.2.6.jar junit.jar org.hamcrest.core_1.3.0.v201303031735.jar cupv1
 0k-runtime.jar org.eclipse.wst.xml.xpath2.processor_1.1.0.jar xml-api
 s.jar serializer.jar xercesImpl.jar xercesSamples.jar
Build-Time:  2018/04/26 01:01:49
Class-Path: .

Теперь, когда я пытаюсь прочитать манифест и получить доступ к «Build-Time», я не могу его найти!

Это код, который я использую для чтения манифеста (ов).Существует избыточный код, показывающий, что некоторые ресурсы читаются правильно.

Enumeration<URL> resources = ConversionConstants.class.getClassLoader().getResources("META-INF/MANIFEST.MF");
while (resources.hasMoreElements()) 
{
    URL url = resources.nextElement();  
    System.out.println(" Url " + url.toString());

    try
    {
        Manifest manifest = new Manifest(url.openStream());
        Attributes mainAttributes = manifest.getMainAttributes();
        System.out.println(" Created by ? " + mainAttributes.getValue("Created-By"));
        System.out.println(" Build-Time ? " + mainAttributes.getValue("Build-Time"));
        System.out.println("-----------");
        System.out.println("");
    }
    catch (Exception e)
    {
        System.err.println(" Could not open URL " + url + ", " + e);
    }
}

И вот результат:

Url rsrc:META-INF/MANIFEST.MF
 Created by ? 1.8.0_40-b27 (Oracle Corporation)
 Build-Time ? null
-----------

 Url jar:rsrc:java-getopt-1.0.12.jar!/META-INF/MANIFEST.MF
 Created by ? 0.92-gcc
 Build-Time ? null
-----------

 Url jar:rsrc:jug.jar!/META-INF/MANIFEST.MF
 Created by ? 1.4.0_01 (Sun Microsystems Inc.)
 Build-Time ? null
-----------

 Url jar:rsrc:log4j-1.2.15.jar!/META-INF/MANIFEST.MF
 Created by ? Apache Maven
 Build-Time ? null
-----------

 Url jar:rsrc:xom-1.2.6.jar!/META-INF/MANIFEST.MF
 Created by ? 1.6.0_20-b02-279-10M3065 (Apple Inc.)
 Build-Time ? null
-----------

 Url jar:rsrc:junit.jar!/META-INF/MANIFEST.MF
 Created by ? Apache Maven 3.0.4
 Build-Time ? null
-----------

 Url jar:rsrc:org.hamcrest.core_1.3.0.v201303031735.jar!/META-INF/MANIFEST.MF
 Created by ? null
 Build-Time ? null
-----------

 Url jar:rsrc:cupv10k-runtime.jar!/META-INF/MANIFEST.MF
 Created by ? 1.4.1-p4 (Sun Microsystems Inc.)
 Build-Time ? null
-----------

 Url jar:rsrc:org.eclipse.wst.xml.xpath2.processor_1.1.0.jar!/META-INF/MANIFEST.MF
 Created by ? null
 Build-Time ? null
-----------

 Url jar:rsrc:xml-apis.jar!/META-INF/MANIFEST.MF
 Created by ? 1.3.1 (IBM Corporation)
 Build-Time ? null
-----------

 Url jar:rsrc:serializer.jar!/META-INF/MANIFEST.MF
 Created by ? 1.3.1 (IBM Corporation)
 Build-Time ? null
-----------

 Url jar:rsrc:xercesImpl.jar!/META-INF/MANIFEST.MF
 Created by ? 1.4.2 (IBM Corporation)
 Build-Time ? null
-----------

 Url jar:rsrc:xercesSamples.jar!/META-INF/MANIFEST.MF
 Created by ? 1.4.2 (IBM Corporation)
 Build-Time ? null
-----------

Я ожидал Url rsrc: META-INF / MANIFEST.MF содержит мой Build-Time:, но нет ... (Для других jar, в том числе в основном jar, вполне нормально, что Build-time будет нулевым.) Также обратите внимание, что строка Created by ? для rsrc: META-INF/MANIFEST.MF не соответствует тому, что я видел, когда открывал файл Zip / Jar и отображал содержимое (верхнего) манифеста ...

Что происходит?

...