Guice: jdk11/guice 4.2.2

创建于 2019-07-04  ·  14评论  ·  资料来源: google/guice

你好,
作为迁移到 jdk11 的一部分,我们被要求升级支持 jdk11 的 guice 版本。

所以在 pom.xml 中我尝试从 4.0 => 4.2.2 升级 guice 版本并保留其他依赖版本,但是当我启动我们的 REST 应用程序时,它无法获得成功的 C3p0 连接。 但是,如果我恢复到 4.0 版本,它工作正常。

<dependency>
    <groupId>com.google.inject</groupId>
    <artifactId>guice</artifactId>
    **<version>4.2.2</version>**
</dependency>
<dependency>
    <groupId>com.google.inject.extensions</groupId>
    <artifactId>guice-jndi</artifactId>
    <version>4.0</version>
</dependency>
<dependency>
    <groupId>com.google.inject.extensions</groupId>
    <artifactId>guice-servlet</artifactId>
    <version>4.0</version>
</dependency>
<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>
<!-- END: C3P0 database connection and google guice for inject -->

Java 代码

导入 javax.sql.DataSource;
导入 org.slf4j.Logger;
导入 org.slf4j.LoggerFactory;
导入 com.google.inject.AbstractModule;
导入 com.google.inject.Provider;
导入 com.google.inject.jndi.JndiIntegration;

公共类 DemoDataSource 扩展 AbstractModule {
私有静态最终字符串 JNDI_ENV = " java:comp/env/jdbc/c3p0DataSource ";

<strong i="21">@Override</strong>
protected void configure() {

绑定(javax.naming.Context.class).to(javax.naming.InitialContext.class).asEagerSingleton();
提供者dataSourceProvider = JndiIntegration.fromJndi(DataSource.class, JNDI_ENV);
bind(DataSource.class).toProvider(dataSourceProvider).asEagerSingleton();
绑定(DBConnectionPool.class).to(C3P0ConnectionProvider.class).asEagerSingleton();
}
}
}

任何帮助深表感谢。

最有用的评论

我已经发布了可以使用的 JDK 11 Guice 4.2.2 Modular artifacts,

https://www.guicedee.com

所有14条评论

目前没有支持 JDK 11 (JPMS) 的 guice 版本 - 我提出了一些拉取请求,但看起来该项目仅在维护模式下运行。

但我还是继续做了——版本是 4.2.3-SNAPSHOT 并且始终保持最新,所有这些都在大型生产企业环境中。
除了 JCache API 中的一个忽略合成方法(破坏或重复缓存)之外,与原始没有任何变化

在转发之前 - 不要使用任何插件日志库 - 删除 sl4j,学习新的 jdk9 日志系统,它可以满足所有需求
Rest 服务 - 使用 Rest v4,这是 JPMS 兼容的。 然后使用 JPMS 杰克逊 (https://mvnrepository.com/artifact/com.jwebmp.jpms.jackson)
https://mvnrepository.com/artifact/com.jwebmp.jpms.guice

这些都是独立的,是 guiced-ee 框架的一部分,它还包含一个对 JLink 友好的 C3P0 模块()

javax.inject (jdk1.5 编译的 jars 不会在 JDK9 上运行^)

    <dependency>
                <groupId>com.jwebmp.thirdparty</groupId>
                <artifactId>javax.inject</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

JCache - 当前的 ri 和 api 不允许合成方法,并且没有严格命名

               <dependency>
                <groupId>com.jwebmp.thirdparty.jcache</groupId>
                <artifactId>cache-api</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

            <dependency>
                <groupId>com.jwebmp.thirdparty.jcache</groupId>
                <artifactId>cache-annotations-ri-common</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

            <dependency>
                <groupId>com.jwebmp.thirdparty.jcache</groupId>
                <artifactId>cache-annotations-ri-guice</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

2) 激活 - jakarta.activation 包与 javax.activation 发生冲突,因此使 jpms 兼容通过允许这两个包。 jakarta.activation 用于 jaxb 2.3^

<dependency>
                <groupId>com.jwebmp.thirdparty</groupId>
                <artifactId>javax.activation</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

            <dependency>
                <groupId>com.jwebmp.thirdparty</groupId>
                <artifactId>jakarta.activation</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

javax.transaction - 事务 API 必须严格命名才能与 guice-persist 一起使用

     <dependency>
                <groupId>com.jwebmp.thirdparty</groupId>
                <artifactId>javax.transaction</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

BTM - 事务管理器

 <dependency>
                <groupId>com.jwebmp.guicedee.persistence</groupId>
                <artifactId>btm</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
                <exclusions>
                    <exclusion>
                        <groupId>javax.transaction</groupId>
                        <artifactId>jta</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>

Guice JPMS 库

   <!-- Guice until there is a named module-info for jlink-->
            <dependency>
                <groupId>com.jwebmp.jpms.guice</groupId>
                <artifactId>guice-parent</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

            <dependency>
                <groupId>com.jwebmp.inject</groupId>
                <artifactId>guice-parent</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

            <dependency>
                <groupId>com.jwebmp.inject</groupId>
                <artifactId>guice-bom</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

            <dependency>
                <groupId>com.jwebmp.inject</groupId>
                <artifactId>guice</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

            <!-- Guice Extensions -->
            <dependency>
                <groupId>com.jwebmp.inject.extensions</groupId>
                <artifactId>extensions-parent</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

            <dependency>
                <groupId>com.jwebmp.inject.extensions</groupId>
                <artifactId>guice-assistedinject</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

            <dependency>
                <groupId>com.jwebmp.inject.extensions</groupId>
                <artifactId>guice-dagger-adapter</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

            <dependency>
                <groupId>com.jwebmp.inject.extensions</groupId>
                <artifactId>guice-grapher</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

            <dependency>
                <groupId>com.jwebmp.inject.extensions</groupId>
                <artifactId>guice-jmx</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>
            <dependency>
                <groupId>com.jwebmp.inject.extensions</groupId>
                <artifactId>guice-jndi</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>
            <dependency>
                <groupId>com.jwebmp.inject.extensions</groupId>
                <artifactId>guice-persist</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>
            <dependency>
                <groupId>com.jwebmp.inject.extensions</groupId>
                <artifactId>guice-servlet</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>
            <dependency>
                <groupId>com.jwebmp.inject.extensions</groupId>
                <artifactId>guice-spring</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>
            <dependency>
                <groupId>com.jwebmp.inject.extensions</groupId>
                <artifactId>guice-testlib</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>
            <dependency>
                <groupId>com.jwebmp.inject.extensions</groupId>
                <artifactId>guice-throwingproviders</artifactId>
                <version>${project.version}</version>
                <type>jar</type>
            </dependency>

带有温和教程的 Guiced-EE 在这里 (https://jwebmp.com/)

非常感谢 GedMarc 的回复。

所以 Google Guice 仍然不支持 Jdk11,这有点奇怪,因为 4.2.2 的文档表明它支持 jdk11!
https://github.com/google/guice/wiki/Guice422 。 (向下滚动,它说它支持 jdk11)

请留下与 REST 相关的内容,我不应该提及它,但由于触发了 C3P0 数据库连接设置代码,因此在我们将 WAR 部署到 tomcat 后初始化期间出现了问题。

任何想法为什么上述代码在使用 guice-inject 4.0 时可以正常工作,而在使用 guice 4.2.2 时不能正常工作(均使用 jdk11 编译器编译)

在更高版本中添加了自动模块名称作为占位符,
没有它,库会被扔进未命名的模块部分,有了它,它会被识别但不兼容 JPMS

请注意,MANIFEST.MF 中的自动模块名称是 PLACEHOLDER,而不是标识符,它在 JPMS 土地上除了保留名称之外没有任何作用,所以不,它根本不是 JDK 11 (JPMS) 友好的.
您将无法构建 JLink 工件,您将无法在严格的模块信息模块中运行(如在非开放模块中),并且您将无法利用使用模块带来的巨大性能提升。

您不能在 JDK 11 JPMS 中使用 WAR/EAR/EJB,托管部署的概念本身就是与模块化开发和 DDD 的直接矛盾。 它们不再存在,因此为什么 EE 被 Oracle 取消并抛弃了——因为它没有交给 eclipse,它被扔掉了,eclipse 决定拿起它来支持选择保留 JDK 8 的系统.

对于 JPMS,请查看为其设计的系统 - 例如 undertow(不是 wildfly ....)或 jetty(不是 tomcat)。

这是大多数声称支持 jpms 的库的常见误解,他们只是说“但我更改了我的清单文件”

感谢您确认 guice 4.2.2 确实不支持 jdk11

最后一个问题。

抱歉,如果我听起来很愚蠢或烦人,但我想重复需要澄清的问题的后面部分。

所以问题又来了

有效的组合:guice-inject 4.0 +(使用jdk11编译器编译)+(部署在使用jdk11的tomcat 11中)

但以下组合不起作用。

guice-inject 4.2.2 +(使用jdk11编译器编译)+(部署在使用jdk11的tomcat 11中)

好奇你是否有任何想法。

manifest.mf 中添加的自动模块名称

https://github.com/google/guice/commit/fe67d047ff6b9c1b866585d0f913e83c20685295

当您获得性能打击时,您就会知道原因:)

非常感谢 GedMarc 的快速回复和耐心。

非常感激
PJ

我有类似的设置,但我不是在寻找任何 JPMS 支持。 应用程序是旧的并且是为 Java 8 编写的。迁移到 Java11 的意图只是从 Oracle8 到 OpenJDK11 而不重构代码。

guice-inject 4.0 +(使用 jdk11 编译器编译)+(部署在使用 jdk11 的 tomcat 9 中)会成为问题吗?

Guice 注入 4 使用 jdk 11 编译器编译(你将如何将 jar/jar cglib 和 asm 放入已编译的项目中?也许是 Shade?)
@sameerinbox因为您不是“使用” jdk 11,而是更多“滥用”向后兼容性,所以您会受到警告和较大的性能冲击,仅此而已。

请记住,您永远不要在生产中运行 JDK,否则,不用担心。

如果其中一位项目维护人员对此问题发表评论,那将非常有帮助。 它是持久性,以及 #1277 #1274 以及自发布以来已经快一年了,在过去 3 个月内用代码关闭了零错误(快速浏览一下,我可能错过了一些东西)使得这个项目看起来非常死气沉沉。 我希望在一个新项目中再次使用它,但如果它快要消失了,我不想在它的基础上继续构建......

@nsoft我将发布 guice 库 4.2.2 的重新打包,具有完全严格的封装支持,包括 jlink 和 jpackage。

它已经永远了,我也很厌倦等待:)
4.2.3-SNAPSHOT 中的变化看起来也并不令人难以置信......移动......

@nsoft 就个人而言,我将继续致力于改进 AOP,以帮助 JDK11+。
(我有各种基于 Guice 构建的应用程序,所以我还想确保它与最新的 JDK 一起工作得尽可能好。)

我切换到没有AOP的版本
com.google.inject:guice:4.2.2:no_aop
这对我有用,因为我的项目现在不需要这些功能(https://github.com/google/guice/wiki/AOP)

我已经发布了可以使用的 JDK 11 Guice 4.2.2 Modular artifacts,

https://www.guicedee.com

此页面是否有帮助?
0 / 5 - 0 等级