有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

仅限java OpenJDK:为什么getResourceAsStream()不返回清单。可执行JAR中的MF

我有一个奇怪的情况。我的代码没有在OpenJDK1.6上使用getResourceAsStream()加载MANIFEST.MF。在OracleJDK1.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:

  • 两种执行都使用相同的方法。罐子
  • Maven正在Oracle JDK 1.7上运行
  • 我正在运行一个安装了两个jdk的系统,通过JAvA_HOMEPATH来“定义”它们
  • 我在经营这个公司。一台机器上的jar在两个不同的控制台中使用不同的JAVA_HOME集和PATHjava

除上述产出外

打开JDK(未设置可选JAVA\u主目录/路径):

$ 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) 个答案

  1. # 1 楼答案

    我还没有使用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,我认为随着JDK7的到来,您可以做很多事情,而且不会有错误风险,而且安全性能更好