Я создаю 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:
Файл в файле 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 и отображал содержимое (верхнего) манифеста ...
Что происходит?