4

興味深い状況があります。私のコードはOpenJDK 1.6でMANIFEST.MFusingをロードしません。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したがって、それは私のアカウントの空とは関係ありません。

4

1 に答える 1

0

私はopenJDK 6を使用していません。おそらく答えには遅すぎるかもしれませんが、同じ問題がありましたが、JDK 1.7.0.2を使用していました。私はあなたがmavenを使っているのを見ます

<plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>        
                <configuration>
                  <archive>
                    <manifest>
                       <mainClass>net.noorg.test.Main</mainClass>
                       <addClasspath>true</addClasspath>
                      <classpathPrefix>classes/META-INF/lib</classpathPrefix>              
                    </manifest>
                  </archive>
                </configuration>
            </plugin>

それが私が実行できる方法です。openJDK6 を使用しないことを強くお勧めします。JDK 7 の登場により、エラーのリスクがなく、セキュリティのパフォーマンスが向上する多くのことができると思います。

于 2013-01-16T17:31:13.163 に答える