当我编译一个依赖于我之前编译的其他模块的模块时,我必须指定该--module-path <directory>选项.这使我依赖的模块可见.
但与此同时,我还想让一些非模块化的Jar文件可见.但是,如果不使它们成为自动模块并且只是在--class-path some.jar旁边指定--module-path <directory>,那么javac似乎忽略了claspath并抛出"package yyy not found"和其他"未找到"错误.
我可以理解,使用--class-path和--module-path在同一个(编译)时间是非法的,但javac并没有以任何方式警告我.
Java EE 7应用程序服务器,特别是Servlet 3.1容器应该允许我们部署包含Web应用程序的WAR文件.WAR文件本质上是一个带有部署描述符(web.xml)和其他几个元素的JAR .
另一方面,Java 9引入了模块化JAR文件的概念,即带有模块descriptor(module-info.class)的JAR,它根据项目Jigsaw制作模块.
那么,WAR文件是否也包含模块描述符并制作"模块化WAR文件"?
是否已有应用程序服务器能够接受"模块化WAR文件"的部署?
一般来说,Java 9模块化方面的servlet容器和WAR文件的未来是什么?
Symfony2使开发人员能够创建自己的命令行命令.它们可以从命令行执行,也可以从控制器执行.根据Symfony2官方文档,可以这样做:
protected function execute(InputInterface $input, OutputInterface $output)
{
$command = $this->getApplication()->find('demo:greet');
$arguments = array(
...
);
$input = new ArrayInput($arguments);
$returnCode = $command->run($input, $output);
}
Run Code Online (Sandbox Code Playgroud)
但在这种情况下,我们等待命令完成它的执行并返回返回代码.
如何从控制器执行命令将其分配到后台而不等待它完成执行?
换句话说,相当于什么
$ nohup php app/console demo:greet &
Run Code Online (Sandbox Code Playgroud) 假设我正在开发一个由2个模块组成的模块化应用程序:com.spacey.explorer这取决于com.spacey.rocket模块.我在某些bin目录中有他们的模块化JAR文件.
我想准备轻量级JRE来运行它.显然,我使用jlink工具:
$ jlink --module-path /opt/jdk-9/jmods:../bin --add-modules com.spacey.explorer --output ~/custom-jre3
Run Code Online (Sandbox Code Playgroud)
现在,当我在JRE中列出模块时,我得到以下内容:
$ java --list-modules
com.spacey.explorer
com.spacey.rocket
java.base@9
Run Code Online (Sandbox Code Playgroud)
也就是说,我的应用程序模块捆绑到JRE中.但是如果我想构建一个只有JDK源模块的JRE,这些模块足以运行我的应用程序并保持我的应用程序模块分离,我必须知道我的JDK依赖项是什么(在这个例子中就是这样java.base)并明确指定它们喜欢:
$ jlink --module-path /opt/jdk-9/jmods --add-modules java.base --output ~/custom-jre3
Run Code Online (Sandbox Code Playgroud)
有没有办法让jlink为我这样做?或者任何可以为我找出那些JDK起源的依赖项的工具?
Java 9中项目Jigsaw的主要目标之一是可靠的配置.也就是说,Java 9承诺解决类路径机制缺陷,它允许java启动程序运行程序,而不确保在运行时加载所有必需的类,这曾经导致java.lang.NoClassDefFoundErrors.
这是module-info.java通过在全新--module-path选项中声明模块依赖性来完成的.在启动Java应用程序之前分析模块图.
但是,我仍然可以做到以下几点.
com.spacey.explorer和com.spacey.rocket. com.spacey.explorer使用com.spacey.rocket.RocketZ由com.spacey.rocket模块定义和导出的类.编译和JARing两个模块后,一切正常运行.com.spacey.rocket.RocketZ从com.spacey.rocket模块中删除类型并重新编译并重新JAR只有这一个模块.com.spacey.explorer使用新编译的com.spacey.rocket模块运行以前编译的模块.java.lang.NoClassDefFoundError,这可能是在4小时的应用程序正常运行时间之后.有没有办法真正确保在运行Java应用程序时不仅验证了模块图(模块路径)的完整性,而且还完成了对实际类型可访问性的全面检查?
使用 JDK 11,如果查看 JRF 记录的摘要,您可以看到有 140 个不同的事件。其中一些可能没有发生,这在输出中清晰可见:
$ jfr summary /c/dev/jfrec/ddos.jfr
Version: 2.0
Chunks: 1
Start: 2020-10-31 19:39:36 (UTC)
Duration: 54 s
Event Type Count Size (bytes)
=============================================================
jdk.JavaMonitorWait 2727 79342
jdk.NativeMethodSample 2590 40722
jdk.ThreadPark 2125 89947
...
jdk.GCHeapConfiguration 1 30
jdk.YoungGenerationConfiguration 1 21
jdk.JavaMonitorInflate 0 0
jdk.ReservedStackActivation 0 0
Run Code Online (Sandbox Code Playgroud)
它们都具有类似于 package 中的 Java 类的名称jdk。
另一方面,如果我想实现自己的自定义 JFR 事件,我必须扩展该类jdk.jfr.Event,因此我认为所有jdk.*事件也都扩展该类jdk.jfr.Event。
在官方 Java SE Javadocs ( https://docs.oracle.com/en/java/javase/11/docs/api/index.html )中jdk.jfr.Event,有文档记录,但没有记录jdk.*类。
如果不在官方 Java …