仅限OpenJDK:为什么getResourceAsStream()不在可执行JAR中返回MANIFEST.MF

时间:2013-01-12 22:44:47

标签: java openjdk

我有一个奇怪的情况。我的代码未在OpenJDK 1.6上使用MANIFEST.MF加载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还是我?
  • 这是什么原因?
  • 这只与Manifest有关还是会影响所有资源?

编辑1:

  • 两次执行都使用相同的.jar
  • Maven在Oracle JDK 1.7上运行
  • 我正在运行一个安装了两个JDK的系统,通过JAvA_HOMEPATH
  • “定义”它们
  • 我在一台计算机上运行.jar,在两个不同的控制台中使用不同的JAVA_HOME设置和PATH设置为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无关。

1 个答案:

答案 0 :(得分: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的到来,你可以做很多事情而且没有错误风险和更好的安全性能。