注意:请对交叉编译的所有风险进行不评论。谢谢。
我的情况是我们需要为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可以做到这一点?
编辑:我发现Eclipse编译器为javadoc实用程序不同意的匿名内部类生成字节代码。我正在为这个问题准备一份错误报告。
答案 0 :(得分:6)
根据文档(Java 5,Java 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进行测试。