gpt4 book ai didi

jakarta-ee - 处理 Java EE 和 java.endorsed.dirs 的任何最佳实践?

转载 作者:行者123 更新时间:2023-12-03 16:45:09 25 4
gpt4 key购买 nike

我最近遇到了 glassfish Standalone (v3.1) vs glassfish Embedded (v3.1) vs java SE 以及 java.endorsed.dirs 的使用方式的问题。我遇到的具体问题是 here ,但我不认为这是我最后一次遇到类似的事情。

我找到的资料herehere建议在编译时将 glassfish 认可的库添加到引导类路径。然而,this错误报告表明,在使用嵌入的 glassfish 时,很难正确设置认可的库。

因此,似乎当我部署到独立的 glassfish 容器时,我的应用程序将针对 glassfish 包含的认可库运行,但在使用嵌入式容器时则不会。我遇到了我原来的问题,因为 maven-embedded-glassfish-plugin 没有像 glassfish standalone 那样使用认可的库启动 glassfish 嵌入。我也不确定其他容器(例如:jboss)是否包含与 glassfish 相同的一组认可库。

那么,我 (1) 是否应该努力(很多)确保我的应用程序是根据认可的库编译的,并且始终部署到使用认可的库引导的容器中,或者我应该(2)坚持使用捆绑的内容吗?使用 Java SE 6?

如果我选择 (2),在将我的应用程序部署到使用较新认可的库引导的容器时,我是否必须担心不兼容?

我将不胜感激任何人可以提供的任何见解。

最佳答案

编辑 : javaee-endorsed-api上面的方法可能会正常工作,但它给了我威利。我认为不再生产或维护它。此外pom.xml它包含在其中反射(reflect)在某些时候它被称为 javaee-compact-api ,您可以看到他们如何从中剥离实现类。相比之下,挑选你想要使用的 API jars 作为背书(正如我在下面推荐的)似乎更稳定和灵活。最后,如果你还想使用javaee-endorsed-api方法,你仍然可以使用我推荐的通用方法并指向javaee-endorsed-api.jar反而。

瑞安;我只是在同一旅程中梳理了您对此的长篇大论(涉及 StackOverflow、java.net 论坛等)。

在单元或集成测试期间,您需要设置 java.endorsed.dirs如您所知,系统属性。

诀窍是您必须以这样一种方式来执行此操作,以便运行测试的 JVM 接收它。这取决于您如何运行 Surefire。

如果出于某种原因您将 Surefire 设置为不 fork ,这可能是一件坏事,您应该在此处重新评估您的配置。

如果您将 Surefire 设置为 fork,那么您可能认为您可以简单地包含 java.endorsed.dirssystemPropertyVariables节,像这样:

<systemPropertyVariables>
<java.endorsed.dirs>weWillGetToThisInAMoment</java.endorsed.dirs>
</systemPropertyVariables>

……但那是错误的。原因是实际运行的程序叫做 ForkedBooter ,以及 ForkedBooter以编程方式为您的单元测试设置系统属性。也就是说,到时候你的 <systemPropertyVariables>该节由 ForkedBooter 阅读已经太晚了。

但是你可以使用 <argLine> 在您的 Surefire 配置中,如下所示:
<configuration>
<argLine>-Djava.endorsed.dirs=weWillGetToThisInAMoment</argLine>
</configuration>

现在,Surefire fork 的 VM 将正确设置其认可的目录。现在让我们谈谈要提供什么值(value)。

您想挑选要覆盖的 API。在您的情况下, javax.annotation.*是一个合理的选择。您希望提供本地 Maven 存储库中包含相关 jar 的目录。

这是我使用的值:
${settings.localRepository}${file.separator}org${file.separator}glassfish${file.separator}main${file.separator}javaee-api${file-separator}javax.annotation${file.separator}${javaxAnnotationVersion}
  • Maven 保证 ${settings.localRepository}将扩展到您本地 Maven 存储库所在位置的值(value)。
  • ${file.separator}是一种获取 System.getProperty("file.separator") 值的方法在 Maven 属性替换中。
  • 就我而言,我已经声明了 <dependency>the GlassFish artifact that bundles up the javax.annotation package as defined in Java EE 6 .所以在这里我构建了一条通往工件的路径。我还定义了一个名为 javaxAnnotationVersion 的属性,对我来说,设置为 3.1.2 .

  • 一旦你完成了所有这些,那么当 Surefire 派生一个 VM 来运行你的单元测试时,背书的目录将被设置为你本地 Maven 存储库中包含存放 javax.annotation 的 jar 的目录。类,现在嵌入式 GlassFish(在进程内运行)将使用 Java EE 6 版本 javax.annotation类而不是 Java SE 6 版本。我希望这能够帮到你。

    关于jakarta-ee - 处理 Java EE 和 java.endorsed.dirs 的任何最佳实践?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6439368/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com