興味深い状況があります。私のコードはOpenJDK 1.6でMANIFEST.MF
usingをロードしません。getResourceAsStream()
Oracle JDK 1.6+ では問題なく動作します。OpenJDK で自分のコードを誤って実行していたときに、これに遭遇しました。
main() メソッド:
public static void main(String[] args) throws IOException {
InputStream is = Main.class.getClassLoader().getResourceAsStream("META-INF/MANIFEST.MF");
InputStreamReader isr = new InputStreamReader(is);
char[] c = new char[2048];
int read;
StringBuffer b = new StringBuffer();
while ((read = isr.read(c)) > 0) {
b.append(c, 0, read);
}
System.out.println(b.toString());
}
Maven JAR プラグインの定義:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<mainClass>net.noorg.test.Main</mainClass>
<addClasspath>true</addClasspath>
</manifest>
</archive>
</configuration>
</plugin>
OpenJDK 1.6 を使用する場合:
$ java -version
java version "1.6.0_18"
OpenJDK Runtime Environment (IcedTea6 1.8.7) (6b18-1.8.7-2~squeeze1)
OpenJDK Client VM (build 14.0-b16, mixed mode, sharing)
$ java -jar target/test-load-resource-1.0-SNAPSHOT.jar
Manifest-Version: 1.0
Created-By: 1.6.0_18 (Sun Microsystems Inc.)
Sun JDK 1.6 を使用する場合:
$ java -version
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) Client VM (build 20.4-b02, mixed mode, sharing)
$ java -jar target/test-load-resource-1.0-SNAPSHOT.jar
Manifest-Version: 1.0
Archiver-Version: Plexus Archiver
Created-By: Apache Maven
Built-By: ABC
Build-Jdk: 1.7.0_07
Main-Class: net.noorg.test.Main
- 誰が間違っている - OpenJDK または私?
- これの理由は何ですか?
- これはマニフェストにのみ関連していますか、それともすべてのリソースに影響しますか?
編集1:
- どちらの実行も同じ .jar を使用します
- Maven は Oracle JDK 1.7 で実行されています
- 私は2つのJDKがインストールされたシステムを実行しており、それらを「定義」してい
JAvA_HOME
ますPATH
- 2 つの異なるコンソールで異なるの
JAVA_HOME
セットとにPATH
設定されたを使用して、1 つのマシンで .jar を実行しています。java
上記の出力に加えて
JDK を開きます (代わりの JAVA_HOME/PATH が設定されていません):
$ echo "$JAVA_HOME" ; which java
/usr/bin/java
Sun JDK セット:
$ echo "$JAVA_HOME" ; which java
/usr/local/jdk
/usr/local/jdk/bin/java
編集2:
が OpenJDK に対して適切に定義されている場合JAVA_HOME
(デフォルト)、それは同じです。
$ echo "$JAVA_HOME" ; which java
/usr/java
/usr/bin/java
JAVA_HOME
したがって、それは私のアカウントの空とは関係ありません。