本文介紹了使用Java9的module-info.java放在哪里?的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我有一個OSGI應用程序,我有大約30個包(JAR文件)。今天,我決定看看它是如何工作的/是否與Java9一起工作。
所以我啟動了我的應用程序并獲得了
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by org.apache.felix.framework.util.SecureAction (file:/home/.../jar/org.apache.felix.framework-5.4.0.jar) to method java.net.URLClassLoader.addURL(java.net.URL)
WARNING: Please consider reporting this to the maintainers of org.apache.felix.framework.util.SecureAction
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
閱讀后,我添加了命令行選項
--add-exports java.base/java.net=org.apache.felix.framework
并創建了module-info.java文件,內容如下:
module org.apache.felix.framework { }
我有兩個問題。我應該將這個module-info.java放在哪里才能讓JVM讀取它?如何將此模塊信息與org.apache.felix.framework-5.4.0.jar
文件/捆綁包/JAR綁定?
如果我做錯了所有事情,請為我指明解決此問題的正確方向。
推薦答案
通用提示:
您應該閱讀the State of the Module System以熟悉JPMS。或者,也可以查看this module system tutorial(免責聲明:我是作者)。
如answer to your other question中所述,如果您不想創建模塊,則無需創建。
回答您的特定問題:
模塊聲明(module-info.java
)需要進入源根目錄(例如src/main/java
)。然后它必須在要編譯的文件列表中,因此它將轉換為模塊描述符(module-info.class
)。最后一步是將其包含在打包到JAR中的類文件列表中。(在JAR中有模塊描述符會將其轉換為模塊化JAR。如果放置在模塊路徑上,JPMS會將其轉換為模塊。)
如果您最終不想創建模塊,而希望代碼在未命名的模塊中運行,則可以允許它使用占位符ALL-UNNAMED
訪問內部API-在出現警告的情況下,您需要打開該包以進行反射:
--add-opens java.base/java.net=ALL-UNNAMED
不過,更好的解決方案是停止使用內部API。