哪个JDK的发行版可以运行`javac -source 1.6 -target 1.5`?

时间:2012-02-13 12:23:18

标签: linux ubuntu java javac

注意:请对交叉编译的所有风险进行评论。谢谢。


我的情况是我们需要为Java 5 JVM编译Java 6源代码(以确保JAX-WS的使用是正确的)。以前我们用ant 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实用程序不同意的匿名内部类生成字节代码。我正在为这个问题准备一份错误报告。

2 个答案:

答案 0 :(得分:6)

根据文档(Java 5Java 6),当您按照Cross-Compilation Example中的说明操作时,Oracle SDK应该能够执行此操作。

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编译带有注释的代码,转换后的代码也应该是安全的(除非您的代码剥离器有错误...)

答案 1 :(得分:1)

这个答案是@ThorbjørnRavnAndersen在评论中解释为解决方案的实现。使用示例代码from here,并修复一些拼写错误,我能够使用Eclipse Compiler提供一个示例。

Calculator.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 Calculator文件夹中使用target/classes/example运行。它将在端口8080上启动Web服务,您可以在浏览器上使用URL http://localhost:8080/calculator?wsdl进行测试。