2012-02-13 75 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進行測試。

相關問題