标签: java-platform-module-system

ResolvedModule、Module 和 Observable Module 有什么区别

这些状态中的每一个的文档如下:

ResolvedModule

已解析模块图中的模块。ResolvedModule定义了配置方法来获取解析模块所在的配置。它定义了引用方法来获取对模块内容的引用。

Module

表示一个运行时模块,命名或未命名

问:- 这两者什么时候不同,是在编译时还是运行时,还是只是模块的不同表示?

另一方面,模块路径定义

编译时或运行时环境中内置的模块,连同那些由模块路径上的工件定义的模块,统称为可观察模块的宇宙。

问:- 所有这些都相关吗?有人可以举例说明如何以及在什么时间解释这个概念吗?

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

5
推荐指数
1
解决办法
249
查看次数

Java 9模块和JUnit 4

蚀氧; Windows 7的; JDK 9决赛9月21日; JUnit 4.12和现有的应用程序.作为起点,可以编译,执行应用程序,并且所有JUnit测试都显示为绿色.现在我们使用eclipse生成文件module-info.java.结果如下:

module ch.commcity.topsort {
   exports ch.commcity.topsort;

   requires junit;
}
Run Code Online (Sandbox Code Playgroud)

但是有了错误:junit无法解析为模块.问题是:如何告诉文件junit没有定义任何模块,它应该在兼容模式下运行?

java eclipse junit4 java-platform-module-system java-9

5
推荐指数
2
解决办法
2598
查看次数

带有jlink压缩标记的Java9打包程序

当我们创建jlink运行时映像时,我们可以使用'--strip-debug',' - compress','2',' - no-header-files',' - no-man-pages'等标签,创建一个45mb左右的分发文件夹.

如果我们想使用javapackager,例如创建.DMG文件,我们如何进行类似的压缩?因为这些标签不适用于javapackager.没有它们,最终的捆绑包大约100mb,失去了很多java9模块化的优点,所以我的问题是,是否可以使用javapackager和jlink创建的JRE运行时映像.

谢谢

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

5
推荐指数
1
解决办法
963
查看次数

使用自定义类加载器从爆炸模块加载类

我一直在使用Java中的简单自定义类加载器,到目前为止,一切都按预期用于非模块相关类.但是,我似乎无法找到使用我的类加载器从模块加载类的任何方法,即使模块相关的find*()方法已经重载.我试图做的是从模块"HelloModularWorld"加载一个类并运行它的主要.但是,当我指定包所在的目录时,它会"正常"加载并报告为未命名的模块.我错过了什么?

类加载器只是从文件系统的其他地方加载类,没什么特别的.

类加载器实现:

package arch.classloaders;

import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;

public class ModifiableClassLoader extends ClassLoader {
    private File searchPath;
    //...other ctors...
    public ModifiableClassLoader(File path, String name, ClassLoader parent) {
        super(name, parent); //Delegate to parent classloader as required.
        if (!path.isDirectory()) throw new IllegalArgumentException("Path must be a directory");
        searchPath = path;
    }

    public void setPath(File newPath) {...}

    public File getPath() {...}

    //Responsible for actual loading
    public Class<?> findClass(String binName) throws ClassNotFoundException {
        File classfile = new File(searchPath.getPath() + File.separator …
Run Code Online (Sandbox Code Playgroud)

java classloader java-platform-module-system java-9 java-module

5
推荐指数
1
解决办法
650
查看次数

Java 9:拼图和休眠 5.2.12 不起作用

在我的pom.xml文件中,我只有一个依赖项:

<dependencies>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <version>5.2.12.Final</version>
    </dependency>
</dependencies>
Run Code Online (Sandbox Code Playgroud)

还有一个module-info.java

module testmodule {
    requires hibernate.jpa;
    requires hibernate.core;
}
Run Code Online (Sandbox Code Playgroud)

但是当我尝试运行我的应用程序时,我收到错误:Caused by: java.lang.IllegalArgumentException: jboss.transaction.api.1.2.spec: Invalid module name: '1' is not a Java identifier。任何想法如何处理它?

java hibernate jta java-platform-module-system java-9

5
推荐指数
1
解决办法
2056
查看次数

解决Java 9模块系统中的可选依赖项

Java 9模块系统支持可选的依赖关系requires static my.module.依赖项仅在编译时使用,即使它位于module-path中,也不会在运行时解析.那么,如何解决可选的依赖关系呢?

  1. 解决方案:添加标志--add-modules my.module. 问题:是依赖项添加到根依赖项还是以root身份添加?
  2. 是否有可能直接requires避免使用add-modules旗帜?

java java-platform-module-system java-9

5
推荐指数
1
解决办法
89
查看次数

如何使用JDK10(jigsaw)和Maven3来运行JUnit5?

我和一些朋友一起使用jdk 10应用程序,它使用jigsk功能集(在jdk9中引入)和junit5和maven作为构建管理.

但总是如果我们尝试使用Maven运行测试,我们会得到一个InaccessibleObjectException异常,例如:

[ERROR] resourceSchedule  Time elapsed: 0.001 s  <<< ERROR!
java.lang.reflect.InaccessibleObjectException: Unable to make de.truncated.framework.shared.resources.ResourceManagerTest() accessible: module de.truncated.framework.shared does not "opens de.truncated.framework.shared.resources" to unnamed module @ed7f8b4
Run Code Online (Sandbox Code Playgroud)

我现在谷歌搜索...在jdk9它可以简单地使用--permit-illegal-access,但这在jdk10中是不可能的,因为这个标志被删除了.来自junit5的jdk10代码示例和github上的其他代码不会使用拼图看起来如何.

所以看起来我错过了maven,module或jvm args config中的一些主要内容.如果有人可以就此事提供帮助,那将是非常好的.

非常感谢你!

项目的一些额外信息可能会有所帮助:

  • 主代码由模块信息文件配置,该文件导出(不打开)给每个人(它的代码库之类的框架)
  • 测试代码没有模块化
  • 目前没有应用jvm args

二手版本:

<properties>
   <java.version>10</java.version>
   <maven.compiler.version>3.7.0</maven.compiler.version>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
   <surefire.version>2.21.0</surefire.version>
   <asm.version>6.1.1</asm.version>
   <junit.jupiter.version>5.2.0</junit.jupiter.version>
   <junit.platform.version>1.2.0</junit.platform.version>
</properties>
Run Code Online (Sandbox Code Playgroud)

depencies:

    <!--
    junit 5 dependency
    -->
    <dependency>
        <groupId>org.junit.platform</groupId>
        <artifactId>junit-platform-launcher</artifactId>
        <version>${junit.platform.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-api</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>

    <dependency>
        <groupId>org.junit.jupiter</groupId>
        <artifactId>junit-jupiter-engine</artifactId>
        <version>${junit.jupiter.version}</version>
        <scope>test</scope>
    </dependency>
Run Code Online (Sandbox Code Playgroud)

构建插件:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>${maven.compiler.version}</version> …
Run Code Online (Sandbox Code Playgroud)

java maven-3 java-platform-module-system java-10 junit5

5
推荐指数
1
解决办法
797
查看次数

在Java 9+中使用JRE运行时,我可以提供运行时编译器访问吗?

我正在将应用程序迁移到Java 10.我们的应用程序通常使用JRE运行,但我们允许用户通过捆绑tools.jar和使用反射来JavacTool按需加载实例来编译自己的自定义代码.我们的方法如下:

public static JavaCompiler getJavaCompiler() {
    String toolJarName = "tools.jar";
    File file = getResourceForClass("tools.jar");
    try {
        file = file.getCanonicalFile();
    } catch (IOException ignore) {
    }
    if (!file.exists())
        throw new RuntimeException("Can't find java tools file: '"+file+"'");
    try {
        URL[] urls = new URL[]{ file.toURI().toURL() };
        URLClassLoader cl = URLClassLoader.newInstance(urls);
        return Class.forName("com.sun.tools.javac.api.JavacTool", false, cl).asSubclass(JavaCompiler.class).newInstance();
    } catch (Exception e) {
        throw new RuntimeException("Can't find java compiler from '"+file+"': "+e.getMessage());
    }
}
Run Code Online (Sandbox Code Playgroud)

这是必要的,因为javax.tools.ToolProvider.getSystemJavaCompiler()从JRE运行时返回null.我们的方法在Java 8中运行良好,但tools.jar在Java 9中被删除了,我需要的类 …

java java-platform-module-system java-9 java-10 jmod

5
推荐指数
1
解决办法
408
查看次数

Java:不推荐使用`sun.awt.image`包吗?

我想要使​​用sun.awt.image.PNGImageDecoder在我的项目中使用的一些代码.问题是源代码基于Java 8和我的项目使用JDK 9+(11).所以我收到了这个错误:

包' sun.awt.image'在模块' java.desktop'中声明,它不会将其导出到未命名的模块.

import sun.awt.image.*,和:

符号在模块' java.desktop'中声明,它不导出包' sun.awt.image'

使用PNGImageDecoderImageDecoder

在寻找解决方案的一些努力之后,我发现了一些类似的情况,建议添加requires java.desktop;module-info.java文件(像这种情况这种情况).但是当我意识到这个解决方案只有在你的项目已经有一个module-info.java文件并且你遗漏了一个用过的模块时才有用.

我的项目已经没有此文件(请注意第一条错误消息中的" 未命名模块 ").据我所知,这意味着所有模块都是自动导入的.所以添加这个文件并添加该行没有任何影响,除了(更改错误消息和)导致我的代码的其他部分出现一些类似的问题(当然,这可以通过向module-info.java文件添加所需的模块来解决).

确保我在jmods文件夹(JDK 11)中导入了所有模块,但问题没有解决:

requires java.base;
requires java.compiler;
requires java.datatransfer;
requires java.desktop;
requires java.instrument;
requires java.logging;
requires java.management;
requires java.management.rmi;
requires java.naming;
requires java.net.http;
requires java.prefs;
requires java.rmi;
requires java.scripting;
requires java.se;
requires …
Run Code Online (Sandbox Code Playgroud)

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

5
推荐指数
2
解决办法
1193
查看次数

如何将 json 的 maven 依赖项添加到 &gt;= Java 9 中的模块

在 java 8 项目中,您只需在 maven 中添加以下依赖项

<dependency>
    <groupId>javax.json</groupId>
    <artifactId>javax.json-api</artifactId>
    <version>1.1</version>
</dependency>
<dependency>
    <groupId>org.glassfish</groupId>
    <artifactId>javax.json</artifactId>
    <version>1.1</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)

使用 OpenJDK、Eclipse 2018-12
和 maven 模块,导致在 module-info.java 中出现错误:

包 javax.json.stream 可以从多个模块访问:java.json、org.glassfish.java.json

所以在这两个依赖项目中都有一个名为 javax.json.stream 的包,由于 jigsaw 模块系统,这不再被允许?

如何解决这个问题?

编辑:
我将 maven 依赖项更新为 1.1.4 并将它们放在类路径上。该javax.json-api有module-info.java文件和工作正常,日食显示没有更多的错误。
但是现在javax.json (org.glassfish)没有找到实现的packages ,导致一个ClassNotFoundException: org.glassfish.json.JsonProviderImpl

What more can I do?

编辑:
它现在可以工作了,我忘了在这个项目中生成一个 module-info.java。

java json maven java-platform-module-system module-info

5
推荐指数
0
解决办法
1560
查看次数