标签: java-platform-module-system

使用Jlink在一个平台上为另一个平台创建Java运行时映像

我在Linux机器上使用jlink创建了运行时映像.我linuxinclude文件夹下看到了文件夹.这是否意味着我只能将此运行时映像用于Linux平台?如果是,有没有办法在一个平台上为另一个平台创建运行时映像(例如在Linux for Windows上,反之亦然)

java jlink java-platform-module-system java-9 java-module

18
推荐指数
2
解决办法
3112
查看次数

从 jaxb xjc 一代迁移到 jakarta 和 Java 17

我们正在研究将应用程序从 JDK8 迁移到 JDK17。我们的一些模块使用基于 wsdl 的 Web 服务,其他一些模块使用 .xsd 模式等。无论如何,我们使用 JAXWS 和 JAXB api,这些 API 现在已从 JDK 版本 11 中删除并移至 Jakarta。

我已成功开始使用 jakarta 依赖项从 .wsdl 和 .xsd 文件生成源代码,并且使用 jakarta 导入正确生成了源代码

import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.annotation.XmlAccessType;
import jakarta.xml.bind.annotation.XmlAccessorType;
import jakarta.xml.bind.annotation.XmlElementRef;
Run Code Online (Sandbox Code Playgroud)

而以前它使用的javax.xml.bind.东西在编译时不再可用。我的问题是,虽然我已经成功生成了基于模式的源,但新生成器生成了不同的代码(类名、访问器等),我想在继续重构之前确认这是预期的行为。

例子:

我们的 .xsd 包含以下内容:

<xsd:complexType name="ForkStepType">
    <xsd:annotation>
        <xsd:appinfo>
            <jxb:class name="ForkStep"/>
        </xsd:appinfo>
    </xsd:annotation>
    <xsd:complexContent>
        <xsd:extension base="tns:LinearStepType">
            <xsd:sequence/>
            <xsd:attribute name="forkLevel" type="tns:ForkLevelType" use="required"/>
        </xsd:extension>
    </xsd:complexContent>
</xsd:complexType>
Run Code Online (Sandbox Code Playgroud)

使用 jaxb 版本的xjc生成器2.2.11将生成一个名为 的类ForkStep,我根据该jxb:class元素猜测。3.0.1另一方面,雅加达生成器生成一个名为ForkStepType我猜测来自 …

java xsd java-platform-module-system jakarta-ee java-17

18
推荐指数
1
解决办法
4万
查看次数

Java 9中是否可以使用循环模块依赖?

在Java 9中,是否允许使用循环模块?如果不是,原因是什么?

module com.foo.bar {
    requires com.foo.baz;
    exports com.foo.bar.fizz;
}

module com.foo.baz {
    requires com.foo.bar;
    exports com.foo.baz.buzz;
}
Run Code Online (Sandbox Code Playgroud)

java java-platform-module-system java-9 java-module module-info

17
推荐指数
1
解决办法
1025
查看次数

在Java 9中运行时扫描类路径/模块路径

我似乎无法找到关于是否仍然可以在运行时扫描所有可用类(用于接口,注释等)的任何信息,就像Spring,Reflections和许多其他框架和库当前所做的那样,面对Jigsaw相关的更改类的加载方式.

编辑:这个问题是关于扫描寻找类的真实物理文件路径.另一个问题是关于动态加载类和资源.这是相关的,但非常重复.

更新:Jetty项目为此制定了标准化API的 JEP建议.如果你有办法帮助实现这个目标,请做.否则,等待和希望.

更新2:找到这个相关的发声帖子.引用后代的代码片段:

如果您真的只是想了解启动层中的模块内容(启动时解析的模块),那么您将执行以下操作:

  ModuleLayer.boot().configuration().modules().stream()
         .map(ResolvedModule::reference)
         .forEach(mref -> {
             System.out.println(mref.descriptor().name());
             try (ModuleReader reader = mref.open()) {
                 reader.list().forEach(System.out::println);
            } catch (IOException ioe) {
                 throw new UncheckedIOException(ioe);
             }
         });
Run Code Online (Sandbox Code Playgroud)

java classpath java-platform-module-system java-9 java-module

17
推荐指数
1
解决办法
4206
查看次数

如果 jar 文件具有 L 属性/重解析点,为什么 Java 应用程序无法在 Windows 上运行

我真的希望以下内容能在我们没有想法时敲响警钟。关于如何进一步诊断的答案或建议将不胜感激。

我们有一个 Java 应用程序,它已经运行了 18 个月没有问题。它现在正在迁移到运行 Windows Server 2019 Standard 作为 VM 的新平台。第一次安装时,一切正常,但应用程序会定期启动失败,只能通过重新复制所有 jar 文件来修复。这是暂时的,因为最终它再次失败。

经过大量监控,我们注意到有一个 Windows 进程会定期在所有文件上设置“L”文件属性并创建重新解析数据。这应该不是问题,但是一旦发生这种情况,JVM 将无法启动应用程序。(任何 Windows 高手都知道这是做什么的?)

一个关键点是应用程序是通过指定 JPMS 参数来启动的,例如:

java -p MyApp.jar;MyApp_mods -m  mymodule/mypackage.StartGUI
Run Code Online (Sandbox Code Playgroud)

这运行良好,在 jar 文件上设置了“L”属性,然后失败并显示消息:

Error occurred during initialization of boot layer
java.lang.module.FindException: Module format not recognized: MyApp.jar
Run Code Online (Sandbox Code Playgroud)

将 MyApp.jar 重命名为其他名称,然后将其复制回 MyApp.jar 可以解决问题,因为它会创建一个没有 L 属性和重新解析数据的文件(直到进程重新应用它)

此行为不仅适用于这一操作,还适用于使用模块系统的任何地方,例如:

 java --list-modules any-jar-in-the-app.jar    
Run Code Online (Sandbox Code Playgroud)

有趣的是(!),如果我们尝试一个更简单的非模块化应用程序并运行:

java -jar MySimpleApp.jar
Run Code Online (Sandbox Code Playgroud)

那么即使设置了 L 属性,应用程序也能正常运行。

显然我们并不完全理解,但看起来好像通过模块系统运行以某种方式意味着无法读取具有 L 属性/重新解析数据的文件(?)

我们已经尝试了各种版本的 OpenJDK 热点和 OpenJ9 JVM,但结果相同。有任何想法吗?

java windows reparsepoint java-platform-module-system

17
推荐指数
2
解决办法
270
查看次数

在将Java 8项目迁移到Jigsaw时,我应该在哪里放置单元测试

我目前正在测试使用jdk-9 + 149将Java 8应用程序迁移到Java 9/Jigsaw.

该项目已在标准的Maven目录结构进行布局,即具有src/main/java,src/test/java等等.

当我添加module-info.javasrc/main/java,Maven的编译器插件无法抛出一个NullPointerException.这是因为它希望找到test目录的模块信息.所以,据我所知,选项是:

  • 将测试类保存在单独的模块中,这意味着它们只能访问主模块的导出包.
  • 将测试类与源一起移动到主模块中,这意味着主模块需要测试依赖性.

显然,这些选项似乎都不合适,所以我假设有一种在Maven项目中测试Jigsaw模块的推荐方法.不幸的是,我既没有找到建议也没有例子.

编辑:在发布问题时添加一些我不相关的信息(对不起)

migration unit-testing maven java-platform-module-system java-9

16
推荐指数
2
解决办法
1522
查看次数

从外部模块访问资源文件

到目前为止,直到非模块化的java,你只需要放入一个文件,src/main/java/resources确保它在classpath中,然后加载它

file = getClass().getClassLoader().getResourceAsStream("myfilename"); 
Run Code Online (Sandbox Code Playgroud)

来自类路径中的任何位置.

现在有了模块,情节变浓了.

我的项目设置如下:

module playground.api {
    requires java.base;
    requires java.logging;
    requires framework.core;
}
Run Code Online (Sandbox Code Playgroud)

配置文件放在里面src/main/resources/config.yml.

项目运行

java -p target/classes:target/dependency -m framework.core/com.framework.Main
Run Code Online (Sandbox Code Playgroud)

由于主类不在我自己的项目中,而是在外部框架模块中,因此无法看到config.yml.现在的问题是,有没有办法以某种方式将我的配置文件放入模块或打开它?我是否必须更改框架上游加载文件的方式?

我尝试在module-info中使用"exports"或"opens",但它想要一个包名,而不是文件夹名.

如何以最佳实用的方式实现这一点,以便它可以像Java 8一样工作,并尽可能少地进行更改?

java java-platform-module-system java-9

16
推荐指数
2
解决办法
5946
查看次数

为什么不允许导出整个模块?

在Java 9的模块声明中有2个结构:

exports com.foo;
Run Code Online (Sandbox Code Playgroud)

opens com.foo;
Run Code Online (Sandbox Code Playgroud)

exports赠款编译时访问,同时opens允许运行时访问,如反射和资源.

opens有一个宽容exports,你可以将整个模块定义为open,结果与显式打开每个包相同:

open module com.mod {
Run Code Online (Sandbox Code Playgroud)

但是没有相似的结构

exported module com.mod {
Run Code Online (Sandbox Code Playgroud)

我的问题:为什么会这样; 有什么决定允许一次打开整个模块而不是出口?

java java-platform-module-system java-9 java-module module-info

15
推荐指数
1
解决办法
758
查看次数

无法从java.base模块导出包

使用IDEA-EAP进行JDK9开发实验.

我收到以下错误 -

Error:(3, 20) java: package jdk.internal.misc is not visible  
(package jdk.internal.misc is declared in module java.base, which does
not export it to module com.jigsaw.npe)
Run Code Online (Sandbox Code Playgroud)

类定义如下 -

package experiment;
import jdk.internal.misc.Unsafe;

public class CompareAndSwap {

    static Unsafe UNSAFE = Unsafe.getUnsafe();
    ...
}
Run Code Online (Sandbox Code Playgroud)

我已经尝试module-info.java在使用IDE创建的模块中包含一个文件,其中包含以下语句 -

module com.jigsaw.npe {
    requires java.base;
}
Run Code Online (Sandbox Code Playgroud)

目录结构现在看起来如图所示 -

目录结构

IDE虽然反映了module-info.java未使用的,但可能这就是我无法定义module com.jigsaw.npe上面尝试过的原因.

寻求一些帮助,了解如何正确放置module-info.java和/或除了我错过的以外的任何东西.

java java-platform-module-system java-9 java-module module-info

14
推荐指数
2
解决办法
2万
查看次数

有没有办法在 IntelliJ IDEA 中使用 jlink 来创建自定义的模块化运行时映像?

我正在关注IntelliJ IDEA 2018.2.5 中的Project Jigsaw:Module System Quick-Start Guide。我在 IDE 中做的一切都是正确的,直到链接器部分。有没有办法在 IntelliJ IDEA 中使用 jlink?

jlink(参见JEP 282)是链接器工具,可用于链接一组模块及其传递依赖,以创建自定义的模块化运行时映像(参见JEP 220)。
- Project Jigsaw:模块系统快速入门指南

我在JetBrains Bug & Issue Tracker 中发现了这个能够产生 JLink 人工制品的问题,但它已经开放了 2 年多,甚至没有描述。


作为一种解决方法,我已经看到了这个是否有 maven jigsaw jlink 插件?有趣的问题和最有前途的替代品似乎是Apache Maven JLink Plugin,但它也已经存在 2 年多了,但尚未发布。

java intellij-idea jlink maven java-platform-module-system

13
推荐指数
1
解决办法
2278
查看次数