首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java / Jakarta支持Java模块系统吗?是否可以使用Java模块系统制作web应用程序?

Java / Jakarta支持Java模块系统吗?是否可以使用Java模块系统制作web应用程序?
EN

Stack Overflow用户
提问于 2019-11-06 19:45:59
回答 2查看 2.5K关注 0票数 3

我正在用Java 11和Maven 3.6.1构建我的第一个模块化应用程序。我的IDE是IntellijIDEA 2019.1.3。我添加了一个模块' app‘并添加了module-info.java,但我很困惑,因为我的应用程序正在工作,即使我在应用模块中添加了spring依赖项,我也没有打开模块或模块中的某个包来进行反射。

我在IDE的特性中添加了module-info.java,它迫使我添加requires语句。到目前一切尚好。但是为什么它不打开反射模块就能工作呢?这是Java 11或我的IDE版本中的新特性吗?我做错了什么吗?

我的module-info.java

代码语言:javascript
复制
module app {
    requires spring.web;
    requires spring.webmvc;
    requires javax.servlet.api;
    requires spring.context;
}

我试图在SO和JetBrains上找到答案,但我失败了。

我正在查看这个使用spring模块的家伙(https://youtu.be/hxsCYxZ1gXU?t=2238),他的IDE要求他打开这个模块进行反射。我下载了他的项目并删除了opens语句,它仍然在我的IDE中编译。

还有一个问题:如何使用IDE检查模块路径?我如何才能看到哪些模块存在,以及我的类路径上有什么(现在应该什么都没有)?

编辑:我刚刚意识到我的IDE打印Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED日志。我想这就是原因,但我找不到这个arg从哪里来的。我走得对吗?

编辑2:在控制台日志中,命令行参数如下:

代码语言:javascript
复制
--add-opens=java.base/java.lang=ALL-UNNAMED
--add-opens=java.base/java.io=ALL-UNNAMED
-Djava.util.logging.config.file=C:\Users\Nedim\.IntelliJIdea2019.2\system\tomcat\Unnamed_ems\conf\logging.properties
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
-Djdk.module.showModuleResolution=true
-Dcom.sun.management.jmxremote=
-Dcom.sun.management.jmxremote.port=1099
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.password.file=C:\Users\Nedim\.IntelliJIdea2019.2\system\tomcat\Unnamed_ems\jmxremote.password
-Dcom.sun.management.jmxremote.access.file=C:\Users\Nedim\.IntelliJIdea2019.2\system\tomcat\Unnamed_ems\jmxremote.access
-Djava.rmi.server.hostname=127.0.0.1
-Djdk.tls.ephemeralDHKeySize=2048
-Djava.protocol.handler.pkgs=org.apache.catalina.webresources
-Dignore.endorsed.dirs=
-Dcatalina.base=C:\Users\Nedim\.IntelliJIdea2019.2\system\tomcat\Unnamed_ems
-Dcatalina.home=D:\tomcat\apache-tomcat-9.0.21
-Djava.io.tmpdir=D:\tomcat\apache-tomcat-9.0.21\temp

另外,根据我的日志(我不确定这是否相关):

代码语言:javascript
复制
D:\tomcat\apache-tomcat-9.0.21\bin\catalina.bat run
[2019-11-08 05:42:34,404] Artifact app:war exploded: Waiting for server connection to start artifact deployment...
Using CATALINA_BASE:   "C:\Users\Nedim\.IntelliJIdea2019.2\system\tomcat\Unnamed_ems"
Using CATALINA_HOME:   "D:\tomcat\apache-tomcat-9.0.21"
Using CATALINA_TMPDIR: "D:\tomcat\apache-tomcat-9.0.21\temp"
Using JRE_HOME:        "C:\Program Files\Java\jdk-11.0.5"
Using CLASSPATH:       "D:\tomcat\apache-tomcat-9.0.21\bin\bootstrap.jar;D:\tomcat\apache-tomcat-9.0.21\bin\tomcat-juli.jar"

--show-module-resolution打印出:

代码语言:javascript
复制
root java.sql jrt:/java.sql
root jdk.management.jfr jrt:/jdk.management.jfr
root java.rmi jrt:/java.rmi
root jdk.jdi jrt:/jdk.jdi
root java.transaction.xa jrt:/java.transaction.xa
root java.xml.crypto jrt:/java.xml.crypto
root java.logging jrt:/java.logging
root java.xml jrt:/java.xml
root jdk.xml.dom jrt:/jdk.xml.dom
root jdk.jfr jrt:/jdk.jfr
root java.datatransfer jrt:/java.datatransfer
root jdk.httpserver jrt:/jdk.httpserver
root jdk.net jrt:/jdk.net
root java.naming jrt:/java.naming
root java.desktop jrt:/java.desktop
root java.prefs jrt:/java.prefs
root java.net.http jrt:/java.net.http
root jdk.compiler jrt:/jdk.compiler
root java.security.sasl jrt:/java.security.sasl
root jdk.jconsole jrt:/jdk.jconsole
root jdk.attach jrt:/jdk.attach
root java.base jrt:/java.base
root jdk.javadoc jrt:/jdk.javadoc
root jdk.management.agent jrt:/jdk.management.agent
root jdk.jshell jrt:/jdk.jshell
root jdk.jsobject jrt:/jdk.jsobject
root java.sql.rowset jrt:/java.sql.rowset
root java.management jrt:/java.management
root jdk.sctp jrt:/jdk.sctp
root java.smartcardio jrt:/java.smartcardio
root jdk.unsupported jrt:/jdk.unsupported
root jdk.scripting.nashorn jrt:/jdk.scripting.nashorn
root java.instrument jrt:/java.instrument
root java.security.jgss jrt:/java.security.jgss
root jdk.management jrt:/jdk.management
root jdk.security.auth jrt:/jdk.security.auth
root java.compiler jrt:/java.compiler
root java.scripting jrt:/java.scripting
root jdk.dynalink jrt:/jdk.dynalink
root jdk.unsupported.desktop jrt:/jdk.unsupported.desktop
root jdk.accessibility jrt:/jdk.accessibility
root jdk.jartool jrt:/jdk.jartool
root java.management.rmi jrt:/java.management.rmi
root jdk.security.jgss jrt:/jdk.security.jgss
jdk.security.jgss requires java.security.sasl jrt:/java.security.sasl
jdk.security.jgss requires java.logging jrt:/java.logging
jdk.security.jgss requires java.security.jgss jrt:/java.security.jgss
java.management.rmi requires java.naming jrt:/java.naming
java.management.rmi requires java.rmi jrt:/java.rmi
java.management.rmi requires java.management jrt:/java.management
jdk.accessibility requires java.desktop jrt:/java.desktop
jdk.unsupported.desktop requires java.desktop jrt:/java.desktop
jdk.dynalink requires java.logging jrt:/java.logging
jdk.security.auth requires java.naming jrt:/java.naming
jdk.security.auth requires java.security.jgss jrt:/java.security.jgss
jdk.management requires java.management jrt:/java.management
java.security.jgss requires java.naming jrt:/java.naming
jdk.scripting.nashorn requires jdk.dynalink jrt:/jdk.dynalink
jdk.scripting.nashorn requires java.logging jrt:/java.logging
jdk.scripting.nashorn requires java.scripting jrt:/java.scripting
java.sql.rowset requires java.logging jrt:/java.logging
java.sql.rowset requires java.sql jrt:/java.sql
java.sql.rowset requires java.naming jrt:/java.naming
jdk.jsobject requires java.desktop jrt:/java.desktop
jdk.jshell requires jdk.compiler jrt:/jdk.compiler
jdk.jshell requires java.compiler jrt:/java.compiler
jdk.jshell requires java.logging jrt:/java.logging
jdk.jshell requires java.prefs jrt:/java.prefs
jdk.jshell requires jdk.internal.ed jrt:/jdk.internal.ed
jdk.jshell requires jdk.internal.le jrt:/jdk.internal.le
jdk.jshell requires jdk.internal.opt jrt:/jdk.internal.opt
jdk.jshell requires jdk.jdi jrt:/jdk.jdi
jdk.management.agent requires java.management jrt:/java.management
jdk.management.agent requires java.management.rmi jrt:/java.management.rmi
jdk.javadoc requires java.compiler jrt:/java.compiler
jdk.javadoc requires java.xml jrt:/java.xml
jdk.javadoc requires jdk.compiler jrt:/jdk.compiler
jdk.attach requires jdk.internal.jvmstat jrt:/jdk.internal.jvmstat
jdk.jconsole requires java.desktop jrt:/java.desktop
jdk.jconsole requires jdk.management.agent jrt:/jdk.management.agent
jdk.jconsole requires jdk.attach jrt:/jdk.attach
jdk.jconsole requires java.management.rmi jrt:/java.management.rmi
jdk.jconsole requires java.management jrt:/java.management
jdk.jconsole requires jdk.internal.jvmstat jrt:/jdk.internal.jvmstat
jdk.jconsole requires jdk.management jrt:/jdk.management
jdk.jconsole requires java.rmi jrt:/java.rmi
java.security.sasl requires java.logging jrt:/java.logging
jdk.compiler requires java.compiler jrt:/java.compiler
java.prefs requires java.xml jrt:/java.xml
java.desktop requires java.xml jrt:/java.xml
java.desktop requires java.prefs jrt:/java.prefs
java.desktop requires java.datatransfer jrt:/java.datatransfer
java.naming requires java.security.sasl jrt:/java.security.sasl
jdk.xml.dom requires java.xml jrt:/java.xml
java.xml.crypto requires java.xml jrt:/java.xml
java.xml.crypto requires java.logging jrt:/java.logging
jdk.jdi requires jdk.attach jrt:/jdk.attach
jdk.jdi requires jdk.jdwp.agent jrt:/jdk.jdwp.agent
java.rmi requires java.logging jrt:/java.logging
jdk.management.jfr requires jdk.jfr jrt:/jdk.jfr
jdk.management.jfr requires java.management jrt:/java.management
jdk.management.jfr requires jdk.management jrt:/jdk.management
java.sql requires java.logging jrt:/java.logging
java.sql requires java.transaction.xa jrt:/java.transaction.xa
java.sql requires java.xml jrt:/java.xml
jdk.dynalink binds jdk.scripting.nashorn jrt:/jdk.scripting.nashorn
java.naming binds jdk.naming.rmi jrt:/jdk.naming.rmi
java.naming binds jdk.naming.dns jrt:/jdk.naming.dns
java.management binds java.management.rmi jrt:/java.management.rmi
java.management binds jdk.management jrt:/jdk.management
java.management binds jdk.management.jfr jrt:/jdk.management.jfr
java.compiler binds jdk.compiler jrt:/jdk.compiler
java.compiler binds jdk.javadoc jrt:/jdk.javadoc
java.base binds jdk.zipfs jrt:/jdk.zipfs
java.base binds jdk.localedata jrt:/jdk.localedata
java.base binds jdk.security.jgss jrt:/jdk.security.jgss
java.base binds java.security.jgss jrt:/java.security.jgss
java.base binds jdk.crypto.cryptoki jrt:/jdk.crypto.cryptoki
java.base binds java.smartcardio jrt:/java.smartcardio
java.base binds jdk.crypto.mscapi jrt:/jdk.crypto.mscapi
java.base binds jdk.crypto.ec jrt:/jdk.crypto.ec
java.base binds java.security.sasl jrt:/java.security.sasl
java.base binds java.naming jrt:/java.naming
java.base binds java.xml.crypto jrt:/java.xml.crypto
java.base binds jdk.jdeps jrt:/jdk.jdeps
java.base binds jdk.javadoc jrt:/jdk.javadoc
java.base binds jdk.jlink jrt:/jdk.jlink
java.base binds jdk.jartool jrt:/jdk.jartool
java.base binds jdk.compiler jrt:/jdk.compiler
java.base binds java.desktop jrt:/java.desktop
java.base binds java.management jrt:/java.management
java.base binds jdk.security.auth jrt:/jdk.security.auth
java.base binds java.logging jrt:/java.logging
java.base binds jdk.charsets jrt:/jdk.charsets
jdk.jshell binds jdk.editpad jrt:/jdk.editpad
java.desktop binds jdk.accessibility jrt:/jdk.accessibility
java.desktop binds jdk.unsupported.desktop jrt:/jdk.unsupported.desktop
java.datatransfer binds java.desktop jrt:/java.desktop
java.scripting binds jdk.scripting.nashorn jrt:/jdk.scripting.nashorn
jdk.internal.jvmstat binds jdk.jstatd jrt:/jdk.jstatd
jdk.jstatd requires jdk.internal.jvmstat jrt:/jdk.internal.jvmstat
jdk.jstatd requires java.rmi jrt:/java.rmi
jdk.editpad requires java.desktop jrt:/java.desktop
jdk.editpad requires jdk.internal.ed jrt:/jdk.internal.ed
jdk.jlink requires jdk.jdeps jrt:/jdk.jdeps
jdk.jlink requires jdk.internal.opt jrt:/jdk.internal.opt
jdk.jdeps requires java.compiler jrt:/java.compiler
jdk.jdeps requires jdk.compiler jrt:/jdk.compiler
jdk.crypto.cryptoki requires jdk.crypto.ec jrt:/jdk.crypto.ec
jdk.naming.dns requires java.naming jrt:/java.naming
jdk.naming.rmi requires java.naming jrt:/java.naming
jdk.naming.rmi requires java.rmi jrt:/java.rmi
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-13 09:14:31

让我们总结一下问题和答案。

为了更好地适应这个问题,我重新命名了我的问题,所以在将来,它可以被重用。当我开始这个线程时,问题是:我是否必须在module-info.java中添加一个open语句来打开模块以进行反射。我用Java 11和Spring制作了模块化的web应用程序,我注意到我的设置不需要开放模块或其中的任何包来进行反射。

使用--show-module-resolution标记只列出JDK模块。它没有显示我的任何模块。

用户@Holger在这个问题上帮助最大,。他建议使用System.out.println("classpath: " + System.getProperty("java.class.path"));查看类路径上的内容。也没什么关系。

然后,他建议在代码中的某个地方使用System.out.println(SomeClass.class.getModule());来查看我的代码属于声明的模块或未命名的模块。结果证明它属于未命名的模块。

因此,结论是Apache的ClassLoader将我的类和Spring加载到未命名的模块中。

然后我问Apache支持如何让Tomcat正确地加载我的模块,答案是:

Servlet (或者Java / Jakarta的任何部分)没有使用模块系统。标记

但我还是不能放手,因为我在YouTube上看到一个叫Jaap的家伙在使用模块,他在使用Tomcat。他把他的联系人放在最后一张幻灯片上,所以我决定问他发生了什么事。以下是他的回答的相关部分:

从您的描述中可以看出,您的安装程序与我演讲中的设置的主要区别是,您在单独的Tomcat服务器上运行Spring web应用程序,而在我的演讲中,我使用嵌入式Tomcat服务器构建了Spring Boot应用程序。这是一个微妙的差异,很可能是您遇到的问题的原因。使用Spring,应用程序本身是从命令行引导的。然后,应用程序启动嵌入式Tomcat,使应用程序模块本身负责类加载以及类路径和模块路径。其中大部分是通过Spring在引擎盖下管理的,因此您可以说Spring ( Boot )负责引导Tomcat。您采用的方法是“经典的”Spring (无启动)设置,Tomcat在这里启动流程并负责类加载和加载应用程序。简单一点说:在我的演讲示例中,Spring启动了Tomcat,在您的例子中,情况正好相反。

(...)

确实,目前Java / Jakarta规范不支持模块系统。由于规范的性质,我想这实际上可能是一个很大的挑战来克服。我不知道在过渡到Eclipse基金会之后,这个主题在Jakarta路线图上的位置。我一定会小心的。不幸的是,你的实际问题的答案仍然是,这是不可能在你的设置。

这里的主要外卖是:

  • 核心Java支持Java模块系统。
  • Java / Jakarta不使用Java模块系统,因此web容器将将所有类放入一个未命名的模块中。这种情况发生在单独的Tomcat设置中。
  • 正如Jaap所指出的,Spring使用嵌入式Tomcat,使应用程序模块本身负责类加载、类路径和模块路径。

最后,在我得到@Holger和Jaap的答复后,我找到了和一个有趣的可能的解决方案。我还没试过。

这是一条很长的路,但我们最后说得很清楚。

票数 7
EN

Stack Overflow用户

发布于 2019-11-07 12:42:25

是。您需要使用“open”指令显式地允许反射。

可以使用“opens”将用于反射的包公开给特定的模块。

代码语言:javascript
复制
module org.util.web.server {

    exports org.util.web.server;
    opens org.util.web.server to org.jetbrains.annotations;
}

或者,您可以向所有模块公开用于反射的包。

代码语言:javascript
复制
module org.util.web.server {

    exports org.util.web.server;
    opens org.util.web.server;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58737469

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档