我有点困惑.
Oracle称Java 8与Java 7高度兼容(向后).但是,Java 8程序可以在Java 7上成功运行(SE/EE)的可能性有多大?
如果第一点是真的,Java 8应用程序将在Java 7服务器支持上部署和执行?例如,Tomcat 8还是WildFly?
注意:这似乎是"javac"程序中的限制.
我有需要为Java 5 JVM构建的Java 6代码.我之前使用javac ant目标(使用JDK编译器和ecj)的工作使我相信它只是设置javac的源和目标.因此这个pom.xml片段:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.5</target>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
它可以在Eclipse 3.7中使用Maven支持按预期工作.不幸的是,直接从命令行运行Maven给了我
javac: source release 1.6 requires target release 1.6
Run Code Online (Sandbox Code Playgroud)
与生成的相同javac -source 1.6 -target 1.5.为了澄清,这是Ubuntu的官方OpenJDK 6
x@JENKINS:~$ javac -version
javac 1.6.0_20
x@JENKINS:~$ javac -source 1.6 -target 1.5
javac: source release 1.6 requires target release 1.6
x@JENKINS:~$
Run Code Online (Sandbox Code Playgroud)
官方Oracle Java 7 JDK for Windows显示了相同的行为.
注意:我不想构建Java 5库或任何东西.只是活动的javac生成Java 5 兼容的字节码.
如何在仍然与Eclipse Maven插件兼容的同时获得我想要的内容?
(编辑:除了@Override我还想在Java 6中使用JAX-WS库进行编译时使用,但仍然生成Java 5字节代码 - 我可以在部署时故意在Web容器中添加JAX-WS库到Java 5安装)
编辑:事实证明maven-compiler-plugin可以被告知使用另一个编译器,Eclipse编译器可以这样做:
<plugin>
<!-- Using the eclipse compiler allows …Run Code Online (Sandbox Code Playgroud) 我已经看到了JDK的发行版可以运行`javac -source 1.6 -target 1.5`中讨论的编译选项?.我理解源和目标的各个选项.我不明白为什么源版本高于目标版本.编译旧目标的代码是有道理的.但在这种情况下,为什么我们不使用我们希望能够运行的最老目标的-source
你能用Java 8编译一个类,然后在Java 7中使用它吗?
我想用一个简单的接口(Java 7兼容)编写一个实用程序JAR,但是在里面使用lambdas.然后我想在一些必须用JDK 7编译的代码中使用该实用程序.
可能吗?
正如你所看到的,有一些相互矛盾的答案......所以,真相是什么?;-)
我正在开发一个小型库,出于明显的原因,我想使用所有Java 11功能(我现在猜不到的模块除外)来生成代码,但是我希望该库与Java 8及更高版本兼容。
当我尝试这个:
javac -source 11 -target 1.8 App.java
Run Code Online (Sandbox Code Playgroud)
我收到以下消息:
warning: source release 11 requires target release 11
Run Code Online (Sandbox Code Playgroud)
...当我查看字节码时,我看到该类的版本为0x37(Java 11):
$ xxd App.class
00000000: cafe babe 0000 0037 ...
Run Code Online (Sandbox Code Playgroud)
Java 8无法加载它:
Exception in thread "main" java.lang.UnsupportedClassVersionError: App has been
compiled by a more recent version of the Java Runtime (class file version 55.0),
this version of the Java Runtime only recognizes class file versions up to 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(ClassLoader.java:763)
at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142)
at java.net.URLClassLoader.defineClass(URLClassLoader.java:468)
at …Run Code Online (Sandbox Code Playgroud)