2012-02-13 40 views
3

注意:请做而不是评论所有交叉编译的风险。谢谢。哪个JDK的发行版可以运行`javac -source 1.6 -target 1.5`?


我有,我们需要有Java 6的源代码编译为Java 5 JVM的情况(以确保JAX-WS的使用是正确的)。此前我们已经与蚂蚁ant脚本做到了这一点(这显然可以),但迁移到Maven的后,我们发现它的javac抱怨结束:

$ javac -source 1.6 -target 1.5 
javac: source release 1.6 requires target release 1.6 

用于Linux任何 Java发行(Ubuntu的11.10 ,x86)的javac可以做到这一点?


编辑:它似乎不是,因为在javac中的限制是相同的。解决方案(使这个需求消失)是从默认的javac编译器更改为maven-compiler-plugin中的eclipse编译器。


编辑:我发现,Eclipse编译器生成的javadoc的效用不同意匿名内部类的字节码。我正在为这个问题准备一份错误报告。

+1

这个问题是如何不同于你的另一个关于此:http://stackoverflow.com/questions/8970920/maven-javac-source-release-1-6-requires-target-release-1-6 – 2012-02-13 13:01:46

+0

为什么你需要'source'参数吗?使用Java5中没有的类吗? – 2012-02-13 13:02:30

+0

@ThorbjørnRavn Andersen:如果你使用* -target 1.5 *进行编译,那么你会如何知道,例如,* ConcurrentSkipListSet *在1.5上不存在?现在我们确实需要支持那些不会(也不会)拥有Java 6的旧OS X机器,但我们只是简单地使用JDK1.5编译器,这很方便,因为我们得到:*“找不到符号:class ConcurrentSkipListSet”*(实际上IntelliJ被设置为1.5,但无论如何,这只是一个例子)。如果您需要定位1.5个JVM,不会使用JDK1.5编译器编译源代码是否是一种选择? (哦,你想保持覆盖,你评论说,在你自己的愚蠢) – TacticalCoder 2012-02-13 13:18:37

回答

6

根据文档(Java 5Java 6),甲骨文SDK应该能够当您按照Cross-Compilation Example指令做这个。

Java 6应支持1.3到1.6之间的任何版本,如-target;它不会说当你在源代码中使用泛型和其他“兼容”功能时会发生什么。编译器应该能够去除它们。

在游戏中的另一个罪魁祸首可能是javac:本编译可能能够处理这组参数,但命令行工具可能见怪。

在这种情况下,请使用Java Compiler API编写自己的命令行。这可能会导致一些你无法实现的技巧。

您也可以尝试Eclipse编译器(请参阅“Using the batch compiler”)。

由于Java的工作原理,这可能会失败:只要X < = Y,Java X代码就可以在Java Y上运行。因此,虽然可以轻松编译Java 6 VM的Java 1.4代码,但反过来并不总是正确的。

如果一切都失败了,写一个预处理器,读取源并剥离不支持的元素(如接口上的@Override)。只要你编译代码有一段时间与Java 6的注释,转换后的代码应该也是安全的(除非你的代码剥离器有一个bug ...)

+0

唉,不管它是什么_应该,它不会,并且是的,罪魁祸首是javac。对于javac不报告此错误的Linux JDK发行版,您有任何建议吗? – 2012-02-13 13:25:48

+3

我用Java做了很多奇怪的事情,我还没有听说过可以自动“降级”源代码的单个SDK。因此我的其他建议。也就是说,如果你想投入时间,Eclipse编译器可能是你最好的选择,因为它带有完整的源代码。你可以破解它做你想做的 - 如果它不能。 – 2012-02-13 13:28:22

+0

ant中的'javac'任务可以做到这一点。它很可能不会将javac作为应用程序调用,而是通过tools.jar中的一些API调用,但我没有调查过它。 – 2012-02-13 13:35:52

1

这个答案是什么@ThorbjørnRavnAndersen在评论中解释为解决方案。使用示例代码from here,并修复了一些拼写错误,我能够使用Eclipse编译器创建一个示例。

计算器。java的

package example; 

// there needs to be a package to avoid A "@WebService.targetNamespace must be specified on classes with no package" 
// when running this 

import javax.jws.WebService; 
import javax.jws.WebMethod; 
import javax.xml.ws.Endpoint; 

@WebService 
public class Calculator { 
    @WebMethod 
    public int add(int a, int b) { 
     return a+b; 
    } 

    public static void main(String[] args){ 
     // create and publish an endpoint 
     Calculator calculator = new Calculator(); 
     Endpoint endpoint = Endpoint.publish("http://localhost:8080/calculator", calculator);   
    } 
} 

的pom.xml

<project> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>fi.eis.applications</groupId> 
    <artifactId>ws-calculator</artifactId> 
    <version>1.0-SNAPSHOT</version> 
    <build> 
    <plugins> 
     <plugin> 
     <artifactId>maven-compiler-plugin</artifactId> 
     <version>3.3</version> 
     <configuration> 
      <source>1.6</source> 
      <target>1.5</target> 
      <compilerId>eclipse</compilerId> 
     </configuration> 
     <dependencies> 
      <dependency> 
      <groupId>org.codehaus.plexus</groupId> 
      <artifactId>plexus-compiler-eclipse</artifactId> 
      <version>2.6</version> 
      </dependency> 
     </dependencies> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

,您可以用mvn clean compile编译,然后用java Calculatortarget/classes/example文件夹中运行。它将在端口8080上启动Web服务,您可以在浏览器上使用网址http://localhost:8080/calculator?wsdl进行测试。

相关问题