在JSE版本之间存在差异的一些问题之后,我正在尝试记录用于编译的
Java编译器版本(实际上是Groovy 2.1.9,Grails 2.3.8,Java 1.7.0_60).
经过一番翻找后,我构建了这段代码来读取该类的前导字节 – 请参阅/ http://en.wikipedia.org/wiki/Java_class_file#General_layout
(更改类的路径以匹配包名称):
class CompilerVersionSupport { public static String getVersion() { String classAsPath = 'com/my/organisation/CompilerVersionSupport.class'; InputStream stream = (new CompilerVersionSupport()).getClass().getClassLoader().getResourceAsStream(classAsPath); DataInputStream ins = new DataInputStream (stream) assert( ins.readUnsignedShort() == 0xcafe ) assert( ins.readUnsignedShort() == 0xbabe ) int minor = ins.readUnsignedShort(); int major = ins.readUnsignedShort(); ins.close(); int javaVersion = major - 44 return "1.$javaVersion" } }
麻烦的是,它返回1.5.
会发生什么事?
>查尔斯
解决方法
默认的Groovy行为不是使用与正在使用的JDK相同的字节码版本来编译代码. 1.5是默认的兼容性原因,恕我直言.如果希望编译器输出较新的字节码,则需要明确设置.
例如,如果您使用Maven编译代码,则可以使用GMavenPlus插件.请参阅targetBytecode参数的说明.
如果您不使用Maven,可以使用-Dgroovy.target.bytecode = 1.7或研究特定构建工具的可能性