2017-09-18 42 views
9

當我編譯一個依賴於我以前編譯的其他模塊的模塊時,我必須指定--module-path <directory>選項。這使得我依賴的模塊可見。是否可以在javac(JDK 9)中混合使用--class-path和--module-path?

但同時我也想使一些非模塊化的Jar文件可見。但是,如果不使它們成爲自動模塊,並且只需在--module-path <directory>旁邊指定--class-path some.jar,那麼javac似乎忽略了claspath並拋出「package yyy not found」和其他「未找到」錯誤。

我可以理解,使用--class-path--module-path在同一(編譯)時間是非法的,但的javac不提醒我反對以任何方式。

+0

有可能混合兩者,你可以分享一個我們可以驗證的最小例子嗎? –

+0

*我可以理解,在同一(編譯)時間使用--class-path和--module-path是非法的,*爲什麼會這樣呢? – nullpointer

+5

混合是絕對合法的。但是,模塊化jar無法在類路徑中引用非模塊化jar。自動模塊(模塊路徑上的非模塊化jar)充當橋接器:模塊化jars_can_引用它們,自動模塊可以讀取類路徑。 –

回答

14

您可以並行使用類路徑和模塊路徑,但需要考慮一些細節。

依賴模塊路徑〜>類路徑

顯式模塊(與模塊路徑上的模塊描述符的JAR)不能讀取無名模塊(類路徑上的JAR) - 這是故意以防止模塊化做JAR取決於「班級路徑的混亂」。

由於模塊必須要求其所有依賴關係,並且只能由其他命名模塊(即類路徑上不包含JAR)來實現,因此必須將模塊JAR的所有依賴關係置於模塊路徑上。是的,即使是非模塊化的JAR,它也會變成automatic modules

有趣的是,自動模塊可以閱讀無名模塊,所以他們依賴性可以去在類路徑上。

依賴類路徑〜>模塊路徑

如果您編譯非模塊化的代碼或從非模塊化的JAR啓動一個應用程序,該模塊系統仍然在發揮作用,並因爲非模塊化的代碼不表達任何依賴關係,它不會從模塊路徑解析模塊。

因此,如果非模塊化代碼取決於模塊路徑上的工件,則需要使用the --add-modules option手動添加它們。不一定都是這些,只是那些你直接依賴的(模塊系統將拉動傳遞依賴) - 或者你可以使用ALL-MODULE-PATH(檢查鏈接的文章,它會更詳細地解釋這一點)。

+5

Nicolai - 你的回答是正確的,但我認爲可以擴展指出'--add-modules'選項可能需要確保類路徑代碼所需的模塊得到解決。原始問題問爲什麼javac失敗,我認爲這是因爲他/她正在編譯類路徑上的代碼,並引用模塊路徑中的模塊中的類,只需要'--add-modules'來確保模塊已解析。 –

+0

我認爲OP正在嘗試編譯帶有非模塊化依賴項的模塊化代碼 - 無論哪種方式,我都會添加其他方向,以確保正確性。 – Nicolai

9

我相信使用--classpath--module-path選擇在同一時間並不違法。即使沒有明確指定類路徑默認值到當前目錄,也可以同時使用兩者。從javac -help消息

細節和javac tools docs -

--module-path <path>, -p <path> 

指定查找應用模塊

--class-path <path>, -classpath <path>, -cp <path> 

指定查找用戶類文件和註釋處理器

如果--class-path-classpath-cp未指定,則用戶 類路徑爲當前目錄


編輯:感謝@MouseEvent,我可能錯過了部分問題

但是,如果不使它們自動模塊僅僅指定 --class - path some.jar緊挨着--module-path,然後javac似乎忽略了claspath並拋出了「未找到包yyy」 和其他「未找到」錯誤。

如果你沒有讓他們自動的,它視爲一個Module System's unnamed module和 -

命名模塊不能,其實連申報於 無名模塊依賴。這種限制是有意的,因爲允許命名爲 的模塊依賴於類路徑的任意內容,因此 不可能進行可靠的配置。

此外,無名模塊導出所有包,因此在一個自動模塊的代碼將能夠訪問來自類路徑加載的任何公開的類型。

但是,使用來自類路徑的類型的自動模塊不能將這些類型暴露給依賴它的顯式模塊,因爲顯式模塊無法聲明對未命名模塊的依賴關係。

如果顯式模塊com.foo.app代碼是指一個公共型 在com.foo.bar,例如,以及該類型的簽名是指 類型的JAR文件仍然類路徑上一個,然後com.foo.app中的代碼 將無法​​訪問該類型,因爲 com.foo.app不能依賴未命名的模塊。

這可以通過處理com.foo.app作爲自動模塊暫時使得其代碼可以從類路徑訪問的類型,直到這樣的時間作爲類路徑上的相關的JAR文件來補救可以被視爲一種自動模塊或轉換爲顯式模塊。

+1

更不用說如果它是合法的......未命名模塊的整個概念是針對classpath中的jar,並且明確的模塊不能訪問它們。 – Mordechai

+0

@MouseEvent這是真的。我相信我錯過了那部分問題,雖然以前只是回答了標題。編輯以包括這一點。謝謝:) – nullpointer

相關問題