2015-02-24 16 views
1

我試圖建立我jwrapper應用程序沒有Java 7的任何地方,而且它失敗Jwrapper失敗,壞類版本對Java 7 invokedynamic當在望

WARNING: Error on output: java.io.IOException: bad class major version for Java 7 invokedynamic 
********************************** 
*   BUILD FAILED   * 
********************************** 
** Error Trace: 

java.io.IOException: bad class major version for Java 7 invokedynamic 
    at com.sun.java.util.jar.pack.PackageWriter.writeByteCodes(PackageWriter.java:1657) 
    at com.sun.java.util.jar.pack.PackageWriter.writeMembers(PackageWriter.java:1227) 
    at com.sun.java.util.jar.pack.PackageWriter.writeClassesAndByteCodes(PackageWriter.java:1202) 
    at com.sun.java.util.jar.pack.PackageWriter.write(PackageWriter.java:79) 
    at com.sun.java.util.jar.pack.PackerImpl$DoPack.flushPackage(PackerImpl.java:602) 
    at com.sun.java.util.jar.pack.PackerImpl$DoPack.flushAll(PackerImpl.java:556) 
    at com.sun.java.util.jar.pack.PackerImpl$DoPack.run(PackerImpl.java:492) 
    at com.sun.java.util.jar.pack.PackerImpl.pack(PackerImpl.java:98) 
    at jwrapper.pack200.Pack200Compressor.compressFileToOutputStream(Pack200Compressor.java:225) 
    at jwrapper.archive.Archive.addFileToStream(Archive.java:422) 
    at jwrapper.archive.Archive.addFile(Archive.java:159) 
    at jwrapper.archive.Archive.addFile(Archive.java:103) 
    at jwrapper.archive.LaunchableArchive.addFile(LaunchableArchive.java:43) 
    at jwrapper.archive.LaunchableArchive.addFile(LaunchableArchive.java:29) 
    at jwrapper.JWrapperCompiler.main(JWrapperCompiler.java:2827) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 
    at SecureRunner2.<init>(SecureRunner2.java:452) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:408) 
    at SecureRunner1.<init>(SecureRunner1.java:410) 
    at SecureRunner1.<init>(SecureRunner1.java:227) 
    at SecureRunner1.main(SecureRunner1.java:52) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:483) 

它用來建立,沒有任何問題,在所有,沒有任何改變(不是jwrapper.xml文件,如果這會有幫助,可以附加jwrapper.xml文件,也不需要java版本jdk1.8.0_31,甚至是包裝代碼!)。我感到困惑的是(我是用invokedynamic,java 7,jwrapper等以及它們的各種組合)搜索的,是Java 7甚至涉及到的。我在系統上沒有Java 7的實例 - 我正在打包1.8.0_31 JRE,並且正在使用jdk1.8.0_31來運行該進程。

+2

對Java 7的引用是因爲'invokedynamic'指令已添加到Java 7中的JVM中。所以它看起來像代碼使用'invokedynamic',但類文件版本是Java 6或更早版本(所以主版本是錯的)。 – 2015-02-24 17:47:01

+1

如果您發佈了包含您評論的答案,我會很高興地接受它,因爲您的評論讓我走上了正確的軌道。 – 2015-02-24 18:13:41

回答

2

到Java 7的參考是因爲「invokedynamic」指令加入到JVM中的Java 7

所以它看起來像代碼使用「invokedynamic」,但該類文件版本的Java 6或更早版本(所以主要版本是錯誤的)。

0

事實證明,proguard預處理這些類文件,並將它們標記爲版本1.6的類文件。這很好,直到一些代碼實際上使用了invokedynamic,然後觸發了錯誤。所以這種情況是由於Java 1.8特性的使用而引起的,而不僅僅是包含一個爲Java 1.8而構建的庫。