2017-07-28 1468 views
6

我有以下程序:導出從系統模塊的封裝是不允許用--release

// module-info.java 
module a { 
} 

// Main.java 
public class Main { 
    public static void main(String[] args) { 
     System.out.println(sun.nio.ByteBuffered.class); 
    } 
} 

這個程序與--add-exports選項編譯成功:

> javac --add-exports java.base/sun.nio=a module-info.java Main.java 

然而,當我添加--release的說法,它失敗了:

> javac --add-exports java.base/sun.nio=a --release 9 module-info.java Main.java 
error: exporting a package from system module java.base is not allowed with --release 
1 error 

基本上,這些兩個命令是等價的。那麼爲什麼後者被禁止呢?

此外,由於IDEA將--release參數傳遞給javac,因此如果我的項目需要內部API,則IDEA中的開發將無法進行。

我正在使用JDK 9 + 178。

+0

工作始終 - -add-exports'。我的問題是關於'--add-exports'和'--release'的組合,這使得它完全不同。 – ZhekaKozlov

+0

同意,我將刪除評論:) – Tavo

+0

正如邁克爾復活節所說的,這些選項的組合已被javac禁止,所以現在IDEA開發人員可以調整它們的編譯器調用。我提交了https://youtrack.jetbrains。com/issue/IDEA-176994 - 希望它很快就會被修復。 –

回答

3

this bug ticket--release不能在組合使用--add-exports--add-reads,和--patch-module時出現。

從鏈接:

這裏的整體建議是讓讓--release 9工作持續 JDK 9,(預計)JDK 10之間,甚至在 可能不同行爲的成本的命令,如:
$ <jdk9>/javac Test.java
$ <jdk9>/javac --release 9 Test.java

另外:

考慮到--release的意圖,應允許 針對給定的JDK版本使用受支持的API的編譯代碼。

在具體的建議是:

[編輯]

-prevents使用--add-出口,-add-讀取並結合--patch模塊爲系統模塊 - 釋放(任何版本)

Here是包含文件的diff:

從系統模塊導出包{0}不是人lowed與 --release

我不能理髮表評論,但來自上述報價,它涉及到允許JDK 9 @Tavo這個問題是關於'與JDK 10

+0

那麼,Java 10將不允許從平臺模塊中導出包? – ZhekaKozlov

+0

Java 10將不允許從平臺模塊中組合'--release'和導出包。我不確定我們可以得出結論,只有'--add-exports'在Java 10中不可用。這是一個單獨的問題。請接受最能回答您原始問題的答案。 –

+2

答案是正確的。 '--release'的思想是允許針對特定版本*的* public * API進行編譯,其簽名被記錄並與javac捆綁在一起。另一方面,'--add-exports'及其朋友允許更改* current *版本的* private *(以及public)API。要允許這些選項的組合,javac需要記錄所有版本的所有包和類。 –

相關問題