标签: java-platform-module-system

OSGi,Java模块化和拼图

所以截至昨天早上我还没有找到OSGi甚至是什么的线索.OSGi只是一些流行语,我一直看到它一遍又一遍地出现,所以我终于留出一些时间来了解它.

它实际上看起来很酷,所以我想首先说明(对于记录)我在任何方面都不反O​​SGi,这也不是一个"OSGi-bashing"问题.

在一天结束时,似乎OSGi已经 - 实质上 - 解决了Java Modularity上的JSR 277,它认识到JAR文件规范存在缺陷,导致在某些极端情况下命名空间解析和类加载问题.OSGi还做了很多其他非常酷的东西,但从我可以确定的,这是它最大的吸引力(或者其中之一).

对我来说 - 作为一个相当新的(几年前)Java EE开发人员,我们在2011年并且目前生活在Java 7时代,并且这些类加载问题仍然存在,这绝对令人难以置信.特别是在一个应用服务器上可能有数百个JAR的企业环境中,其中许多应用服务器依赖于彼此的不同版本,并且所有应用服务器同时运行(或多或少).

我的问题:

和我在OSGi中一样感兴趣,并且我想开始了解它以了解它在哪里/是否可以用于我的项目,我只是没有时间坐下来学习大的东西,至少现在.

那么当这些问题出现时,非OSGi开发人员会做些什么呢?目前存在哪些Java(Oracle/Sun/JCP)解决方案?为什么Jigsaw从J7切入?Jigsaw明年将在J8实施的社区有多确定?即使它不是Java平台的一部分,是否有可能为您的项目获得Jigsaw?

我想我在这里问的是恐慌,阴谋和一个facepalm的组合.现在我终于明白了OSGi是什么,我只是不"得到"像Jigsaw这样的东西需要20多年才能实现,然后才能从发布中获得.这看起来很基本.

而且,作为开发人员,我也很好奇我的解决方案是什么,没有OSGi.

另外,注意:我知道这不是一个" 纯编程 "类型的问题,但是在你们中的一些人让你的鼻子弯曲变形之前,我想说明(再次,为了记录)我故意把这个问题放在所以.那是因为我对我的同伴SOE只有最大的尊重,我正在寻找一些我所看到的每天潜伏在这里的"IT之神"的建筑级答案.

但是,对于那些绝对坚持使用某些代码段支持SO问题的人:

int x = 9;
Run Code Online (Sandbox Code Playgroud)

(感谢任何能够权衡这个OSGi/Jigsaw/classloader/namespace/JAR地狱的人!)

java osgi classloader java-platform-module-system

95
推荐指数
3
解决办法
9615
查看次数

迁移到 Java 9 或更高版本时是否需要切换到模块?

我们目前正在从 Java 8 迁移到 Java 11。但是,升级我们的服务并没有我们预期的那么痛苦。我们基本上只需要更改我们build.gradle文件中的版本号,服务就可以愉快地启动并运行了。我们升级了库以及使用这些库的(微)服务。直到现在都没有问题。

是否需要实际切换到模块?恕我直言,这会产生不必要的成本。任何建议或进一步阅读材料表示赞赏。

澄清一下,如果在不引入模块的情况下使用 Java 9+ 代码有什么后果吗?它可以例如变得与其他代码不兼容吗?

java java-platform-module-system java-11

93
推荐指数
2
解决办法
9610
查看次数

为什么要投资Jigsaw/JPMS?

Java的包管理系统对我来说似乎总是简单而有效.JDK本身大量使用它.我们一直在使用它来模仿名称空间和模块的概念.

什么是Project Jigsaw(又名Java平台模块系统)试图填写?

来自官方网站:

该项目的目标是为Java SE平台设计和实现标准模块系统,并将该系统应用于平台本身和JDK.

java java-platform-module-system java-9

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

当module-info.java存在时,findResource("")返回null,为什么会这样?

我正在调试为什么在module-info.java我的Spring Boot应用程序中,spring-orm在启动时抛出异常.这是例外:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: javax/transaction/UserTransaction
    at spring.beans@5.0.8.RELEASE/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1699) ~[spring-beans-5.0.8.RELEASE.jar:na]
    at spring.beans@5.0.8.RELEASE/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573) ~[spring-beans-5.0.8.RELEASE.jar:na]
    at spring.beans@5.0.8.RELEASE/org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) ~[spring-beans-5.0.8.RELEASE.jar:na]
    at spring.beans@5.0.8.RELEASE/org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) ~[spring-beans-5.0.8.RELEASE.jar:na]
    at spring.beans@5.0.8.RELEASE/org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.0.8.RELEASE.jar:na]
    at spring.beans@5.0.8.RELEASE/org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) ~[spring-beans-5.0.8.RELEASE.jar:na]
    at spring.beans@5.0.8.RELEASE/org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.0.8.RELEASE.jar:na]
    at spring.context@5.0.8.RELEASE/org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1089) ~[spring-context-5.0.8.RELEASE.jar:na]
    at spring.context@5.0.8.RELEASE/org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:859) ~[spring-context-5.0.8.RELEASE.jar:na]
    at spring.context@5.0.8.RELEASE/org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.0.8.RELEASE.jar:na]
    at spring.boot@2.0.4.RELEASE/org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.0.4.RELEASE.jar:na]
    at spring.boot@2.0.4.RELEASE/org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762) [spring-boot-2.0.4.RELEASE.jar:na]
    at spring.boot@2.0.4.RELEASE/org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:398) [spring-boot-2.0.4.RELEASE.jar:na]
    at spring.boot@2.0.4.RELEASE/org.springframework.boot.SpringApplication.run(SpringApplication.java:330) [spring-boot-2.0.4.RELEASE.jar:na]
    at spring.boot@2.0.4.RELEASE/org.springframework.boot.SpringApplication.run(SpringApplication.java:1258) [spring-boot-2.0.4.RELEASE.jar:na]
    at spring.boot@2.0.4.RELEASE/org.springframework.boot.SpringApplication.run(SpringApplication.java:1246) [spring-boot-2.0.4.RELEASE.jar:na]
    at tech.flexpoint.dashmanserver/tech.flexpoint.dashmanserver.DashmanServerApplication.main(DashmanServerApplication.java:13) [classes/:na] …
Run Code Online (Sandbox Code Playgroud)

java java-platform-module-system spring-boot java-10 java-module

51
推荐指数
1
解决办法
1264
查看次数

Project Jigsaw vs Maven

来自Jigsaw项目:

使开发人员能够更轻松地为Java SE和EE平台构建和维护库和大型应用程序.

我正在尝试学习Jigsaw是什么项目,到目前为止,Project Jigsaw的目标似乎与我们使用Maven(或Gradle)依赖关系管理所做的有些重叠:

  • 构建像Maven这样的工具是一种威胁吗?
  • 或者我的理解是错误的,项目Jigsaw将以某种方式补充这些构建工具?

maven java-platform-module-system java-9

39
推荐指数
2
解决办法
7743
查看次数

在Java 9中加载类和资源

我正在阅读InfoQ上引用Reinhold的这篇文章:

开发人员仍然可以使用Java 9中的Java类路径为Java运行时搜索类和资源文件.只是使用Java 9的模块,开发人员不再需要类路径.

所以现在我的问题是:执行上面列出的任务的Java 9方法是什么?如何动态加载例如图像(缺少相对路径的摆弄)?

更有趣的是,如何检查一个类是否可用并动态做出决定(例如,检查Jackson是否可用,如果是,请将其用于JSON序列化,如果不使用别的东西)?

文章还提到Spring Boot已经支持Java 9,Spring Boot肯定会做很多动态加载.那么也许有人知道Spring可以看到的代码片段?

java java-platform-module-system spring-boot java-9

39
推荐指数
2
解决办法
8575
查看次数

Java中的新关键字9

Java 9最大的功能之一将是Project Jigsaw定义的模块系统.在阅读Project Jigsaw:在 JavaOne 2015 的Hood下阅读幻灯片时,我注意到以下源代码:

// src/java.sql/module-info.java
module java.sql {
   exports java.sql;
   exports javax.sql;
   exports javax.transaction.xa;
}
Run Code Online (Sandbox Code Playgroud)

这里有趣的是文件结尾.java并且似乎使用了两个新的关键字:module,和exports.Java 9中将引入哪些其他关键字?如何处理向后兼容性(即命名的函数或变量module)?

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

36
推荐指数
2
解决办法
5219
查看次数

为什么Java 9引入了JMOD文件格式?

Java 9有三种方法可以将编译后的代码打包到文件中:

  • JMOD
  • JIMAGE

JIMAGE针对速度和空间进行了优化,并在运行时由JVM使用,因此有理由引入JIMAGE.JIMAGE文件不应发布到maven repos或在编译或链接时使用.

文档声称JMOD可以存储本机代码和JAR文件无法存储的其他内容,开发人员可以制作和分发自己的JMOD文件.JDK附带jmods/包含JDK 所有模块的目录,供用户依赖.

问题:

  • 为什么Java 9引入了JMOD文件格式?
  • 库作者是应该分发JMOD文件还是JAR文件?
  • jmod文件应该发布到maven repos吗?

java java-platform-module-system java-9

33
推荐指数
2
解决办法
8099
查看次数

Java 9中--add-exports和--add-opens之间有什么区别?

由于新的模块系统,Java 9(jdk-9 + 170)默认情况下不允许应用程序查看JDK中的所有类,这与以前的所有Java版本不同.

要解决此问题,java命令行会提供一个新参数--add-exports,允许按如下方式中断封装:

java -jar josm.jar --add-exports java.base/sun.security.util=ALL-UNNAMED --add-exports java.base/sun.security.x509=ALL-UNNAMED

这在JEP 261中得到了很好的解释.

我已经阅读了--add-opens使用相同语法的类似选项,但是JEP 261尚未更新来描述它(最后更新:2017/03/08 13:58).

这两个选项有什么区别?

编辑:JEP 261已在2017-09-22更新以解释它.

java command-line-arguments java-platform-module-system java-9 java-module

29
推荐指数
1
解决办法
9828
查看次数

包与Java 9中的自动模块冲突

随着Java 9的出现,我认为将我的一些项目移植到Java 9是一个很好的学习练习.在我的一个项目中,我有rxjavarxjavafx的依赖

dependencies {
    compile 'io.reactivex:rxjava:1.2.6'
    compile 'io.reactivex:rxjavafx:1.0.0'
    ...
}
Run Code Online (Sandbox Code Playgroud)

我想将此项目创建为命名模块.要做到这一点,我需要创建一个module-info.java文件,我需要指定的要求rxjava,并rxjavafx在这里.但是,这些库还没有任何模块信息.

为了解决这个问题,我读过我需要创建自动模块.根据我的理解,我需要重命名rxjavarxjavafx罐子有一个简单的名称,然后列出--module-path参数中的罐子.然后requiresmodule-info.java在jar中添加一个指令.

module com.foo.bar {
    requires rxjavafx;
    requires rxjava;
}
Run Code Online (Sandbox Code Playgroud)

我编写了一个gradle任务来为我编辑jar名称,它似乎在大多数情况下都有效.它需要编译所有的jar并将它们重命名为不包含version-info或slashes.然后将这些文件连接成一个:单独的字符串:

tasks.withType(JavaCompile) {
    delete { delete '/tmp/gradle' }
    copy {
        from configurations.compile + configurations.testCompile
        into '/tmp/gradle'
        rename '(.*)-[0-9]+\\..*.jar', '$1.jar'
        rename { String fileName -> fileName.replace("-", "") }
    }
    options.compilerArgs += ['--module-path', fileTree(dir: '/tmp/gradle', include: …
Run Code Online (Sandbox Code Playgroud)

java compiler-errors java-platform-module-system java-9

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