标签: java-module

Java 9 模块的目录布局

我一直在尝试编写 Java 9 模块,但无论我做什么,我都会收到错误“包为空或不存在”。我尝试在线搜索预期的目录布局,并尝试了我能想到的目录布局的每种变体,但没有任何效果。

例如,这是我尝试过的一种布局

bar.foo/module-info.java

module bar.foo {
    exports bar.foo;
}
Run Code Online (Sandbox Code Playgroud)

bar.foo/bar/foo/wtf.java

package bar.foo;

public class wtf {
}
Run Code Online (Sandbox Code Playgroud)

但是,编译仍然给出与平常相同的错误。

> javac bar.foo/module-info.java 
bar.foo/module-info.java:2: error: package is empty or does not exist: bar.foo
    exports bar.foo;
               ^
1 error
Run Code Online (Sandbox Code Playgroud)

java java-9 java-module module-info

6
推荐指数
1
解决办法
3673
查看次数

Java 模块指令如何影响对模块的反射访问?

根据https://www.oracle.com/corporate/features/understanding-java-9-modules.html,Java Module 系统引入了以下指令:

  • 出口,出口...到
  • 用途
  • 提供...与
  • 打开,打开,打开...

每个指令对使用反射访问内部成员的外部模块有何影响(如果有)?

例如,是否exports <package>允许外部模块使用反射访问导出包的所有public, protected,成员?private其他指令又如何呢?

java reflection java-9 java-module module-info

6
推荐指数
1
解决办法
1961
查看次数

如何在运行时扩展模块路径

我喜欢服务。我也喜欢模块系统。对我来说不幸的是,在我使用 Java 9 之前,我养成了从运行时通过 jar 加载的 jar 获取服务提供者的习惯URLClassLoader,就像这样(var为了简洁,我将使用 Java 10 ):

var url = new File("myjar.jar").toURI().toURL();
var cl = new URLClassLoader(new URL[] {url}, getClass().getClassLoader());
var services = ServiceLoader.load(MyService.class, cl);
for (var service : services) {
  ...
}
Run Code Online (Sandbox Code Playgroud)

即使在 Java 9 及更高版本中,这也能正常工作,但它会将 jar 加载到类路径上,这意味着它使用旧META-INF\services方法来查找服务提供者。我宁愿使用该module-info方法,但这需要将 jar 加载到模块路径上,但我找不到任何方法来执行此操作。所以我在这里,希望这里的某个更彻底地了解模块系统的人会告诉我如何做到这一点(或者它不能,如果是这样的话)。

java java-9 java-module module-info

6
推荐指数
1
解决办法
503
查看次数

如何使用 javapackager 生成模块化 Java 应用程序的可执行文件?

环境: Win10、Oracle JDK 9、Eclipse、jlink、javapackager

上下文:我正在尝试生成一个可执行文件,其中包含javapackager 使用 制作的 java 自定义运行时映像jlink,并阅读javapackager 文档。不可安装。

Jlink 创建了一个 zip 文件,其中包含我所有的 java 类文件和封装的资源(这意味着我无法从系统资源管理器访问它们)+ 自定义 jre。它带有一个 .bat 启动器来运行该应用程序。一切正常。

Walkthrow:第一,我发现OpenJDK14 中jpackage有一个OpenJDK 实用程序可以使 java 模块化应用程序可执行,该实用程序仍在开发中。我没有找到任何方法来处理它。后来我研究了 Inno Setup,但它不能满足我的需求(因为我不需要安装程序)后来我发现从 Oracle JDK 8 开始,就有了为每个平台(max、linux、windows..)生成可运行文件的工具。javapackager

我无法使 javapackager 工作。这是我在 Windows cmd 上执行的命令的各种尝试之一。

javapackager 
-deploy 
    -native exe
    --add-modules myModule,javafx.graphics,javafx.controls 
    --module-path "C:\path\to\javafx-jmods;C:\path\to\target\classes;C:\path\to\more\jmods" 
    -outdir "C:\myApp" 
    -outfile MyApp 
    -appclass myPackage.MyApp 
     -name "MyApp"
Run Code Online (Sandbox Code Playgroud)

使用前面的命令我收到错误:

Error: No application jars foun
Run Code Online (Sandbox Code Playgroud)

因此,我意识到我将 -deploy 命令及其选项与 -createjar 命令及其选项混合在一起。

有人可以解释如何使用 javapackager 生成 .exe 吗? …

windows java-9 javapackager java-module

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

Netbeans Swing GUI Builder 不适用于 java-module 项目和 Maven

我想将 Netbeans 的 Swing GUI 构建器与 Maven 项目和 java 模块一起使用。如果将它们编译为 java 模块的一部分,则 GUI Builder 似乎找不到已编译的类。它给出了错误“加载组件时出错(...)无法加载组件类(...)”(请参阅​​示例末尾屏幕截图中的整个错误)

我已经使用 Netbeans 11 将其固定为一个最小的示例:

  • File > New Project > Java with Maven > Java Application(使用默认建议并单击完成)

  • 在“Source Packages”下的项目树中,右键单击并添加一个新的 JFrame 和一个 JPanel。

  • 编译项目(运行 > 构建项目),以便您可以在 GUI Builder 中使用这些类

  • 使用 GUI Builder,通过在设计模式下打开 JFrame 并将 JPanel 拖到 JFrame,将 JPanel 的实例添加到 JFrame。

  • 通过添加文件将项目更新为使用 java 模块src/main/java/module-info.java

module MavenGuiTest {
    requires java.desktop;
    requires java.logging;
}

Run Code Online (Sandbox Code Playgroud)
  • 再次运行“构建项目”。Netbeans 然后检测到它现在是一个 java 模块项目并显示一个对话框: 在此处输入图片说明

  • 点击Yes,在pom.xml中添加如下内容:

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.6.1</version>
            </plugin>
        </plugins>
    </build>
Run Code Online (Sandbox Code Playgroud)
  • 再次运行“构建项目”。现在项目编译完成。 …

java swing netbeans maven java-module

6
推荐指数
1
解决办法
1133
查看次数

为什么模块路径上的模块需要 --add-modules ?

一个例子:由于 JavaFx 从 JDK 中删除,JavaFx SDK 现在作为一组模块化 jar 分发。要编译 JavaFx 应用程序,当然必须将它们放在模块路径中:

javac -p /path/to/jars/ App.java
Run Code Online (Sandbox Code Playgroud)

然而,这还不够。尝试编译会导致很多类似的错误

sample/App.java:3: error: package javafx.application is not visible
import javafx.application.Application;
             ^
  (package javafx.application is declared in module javafx.graphics, which is not in the module graph)
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我们可以使用 --add-modules 添加 javafx.graphics:

javac -p /path/to/jars/ --add-modules javafx.graphics App.java
Run Code Online (Sandbox Code Playgroud)

但是,如果我们将 module-info.java(仅包含module ui {})添加到项目中,则没有问题。

为什么模块路径上的模块对命名模块可见,但对未命名模块不可见?

java java-platform-module-system java-9 java-module java-11

6
推荐指数
1
解决办法
4102
查看次数

javax.xml.stream 包可从多个模块访问:&lt;unnamed&gt;、java.xml

我有编译错误:The package javax.xml.stream is accessible from more than one module: <unnamed>, java.xml。应用程序已maven install成功构建,但它不作为 java 应用程序运行。

CTRL + SHIFT + T 显示该javax.xml.stream包是 JDK-11(模块路径)和(类路径)的一部分stax-apistax-api是父模块的依赖项,无法删除。此问题出现在 Eclipse 2019-12、2020-03、2020-06 和 IntelliJ 以及不同版本的 Java 11 上。

到目前为止,我尝试排除 child 中的所有依赖项的 javax.xml.stream <exclude>javax.xml.stream</exclude> 但没有成功。

我该如何解决这个问题?

java compiler-errors java-module

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

多模块(pom)和java模块系统的区别

我试图了解使用 Java 平台模块系统 (JPMS) 构建项目与使用 multi-poms 构建项目之间的区别。

主要区别是 JPMS 封装代码而多 pom 项目分离项目依赖关系?

我在谷歌上搜索过,但没有找到对差异的很好解释,但我看到模块这个词可以互换使用。

java maven multi-module java-module

6
推荐指数
1
解决办法
428
查看次数

如何将 --add-opens JDK 模块配置传递给 maven 测试

我正在将生产代码中的 java 版本从 java 8 升级到 java 11。

由于使用了flume、zookeeper等第三方库,我必须在应用程序java start命令中添加以下JDK模块配置。

--add-opens java.base/java.lang=ALL-UNNAMED --add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED

添加此配置后,java 应用程序启动正常。

但是当我使用mvn test测试运行测试时失败了。我已将以下配置添加到 maven-surefire-plugin 中,但它仍然抛出错误。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-surefire-plugin</artifactId>
    <version>3.0.0-M5</version>
    <configuration>
        <argLine>--illegal-access=permit</argLine>
        <argLine>--add-opens java.base/java.lang=ALL-UNNAMED</argLine>
        <argLine>--add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED</argLine>
        <argLine>-Dillegal-access=permit</argLine>
    </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

我想我没有在 maven 测试中正确地传递参数。知道我做错了什么以及如何解决这个问题吗?

java maven maven-surefire-plugin java-9 java-module

6
推荐指数
1
解决办法
2431
查看次数

运行Java应用程序时如何解析孵化器模块jdk.incubator.vector

我正在尝试测试 JDK 16 中作为孵化器模块引入的新 Vector API。为此,我有以下类:

import jdk.incubator.vector.FloatVector;
import jdk.incubator.vector.VectorSpecies;

public class Main {

    static final VectorSpecies<Float> SPECIES = FloatVector.SPECIES_256;

    static void vectorComputation(float[] a, float[] b, float[] c) {

        for (int i = 0; i < a.length; i += SPECIES.length()) {
            var m = SPECIES.indexInRange(i, a.length);

            var va = FloatVector.fromArray(SPECIES, a, i, m);
            var vb = FloatVector.fromArray(SPECIES, b, i, m);
            var vc = va.mul(va).
                    add(vb.mul(vb)).
                    neg();
            vc.intoArray(c, i, m);
        }
    }

    public static void main(String[] args) {
        float[] a = …
Run Code Online (Sandbox Code Playgroud)

java java-module

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