首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有处理Java和java.endorsed.dirs的最佳实践?

有没有处理Java和java.endorsed.dirs的最佳实践?
EN

Stack Overflow用户
提问于 2011-06-22 19:53:44
回答 2查看 4.6K关注 0票数 7

我最近遇到了一个关于glassfish standalone (v3.1)、glassfish embedded (v3.1)和java以及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),当我将我的应用程序部署到一个使用较新的背书库引导的容器时,我是否需要担心不兼容?

如果任何人能提供任何见解,我将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-26 07:34:06

我可能遗漏了一些明显的东西但是..。GlassFish Embbeded附带的库不是与Java规范兼容吗?这些库不是默认加载的吗?(如果它们不是,请在这里填充一个错误:http://java.net/jira/browse/EMBEDDED_GLASSFISH)。

我的意思是:您应该针对Java规范API进行编译,并让容器使用它自己的实现。

对于第一部分,如果您使用Maven,我喜欢Codehaus archetypes设置背书库的方式。它既干净又与应用程序服务器无关:

代码语言:javascript
复制
<properties>
   <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
   <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

..。

代码语言:javascript
复制
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>2.3.2</version>
    <configuration>
        <source>1.6</source>
        <target>1.6</target>
        <compilerArguments>
            <endorseddirs>${endorsed.dir}</endorseddirs>
        </compilerArguments>
    </configuration>
 </plugin>

..。

代码语言:javascript
复制
<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <version>2.1</version>
    <executions>
       <execution>
            <phase>validate</phase>
            <goals>
                <goal>copy</goal>
            </goals>
            <configuration>
                <outputDirectory>${endorsed.dir}</outputDirectory>
                <silent>true</silent>
                <artifactItems>
                    <artifactItem>
                        <groupId>javax</groupId>
                        <artifactId>javaee-endorsed-api</artifactId>
                        <version>6.0</version>
                        <type>jar</type>
                    </artifactItem>
                </artifactItems>
            </configuration>
        </execution>
    </executions>
</plugin>

这几乎就是根据JavaEE6API编译项目所需的全部内容。任何与Java EE 6兼容的App Server都应该提供这些服务,您不必担心它们如何将其提供给您的应用程序。

引导Java服务的责任应该由您的App Server负责。如果您尝试自己的“内部”解决方案,JAR Hell很有可能会崩溃。

干杯,

票数 2
EN

Stack Overflow用户

发布于 2012-08-15 23:14:08

编辑:上面的javaee-endorsed-api方法可能会工作得很好,但它让我感到不安。我不认为它已经被生产或维护了。此外,它包含的pom.xml反映了它在某种程度上被称为javaee-compact-api,您可以看到它们是如何将实现类从其中剥离出来的。相比之下,精挑细选您想要使用的API jars (正如我下面建议的那样)似乎更稳定和灵活。最后,如果您仍然想使用javaee-endorsed-api方法,那么您仍然可以使用我推荐的通用方法,并转而使用javaee-endorsed-api.jar

我刚刚梳理了你在这方面的长长的线索(涉及StackOverflow、java.net论坛等)。在同样的旅程中。

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

诀窍在于,您必须以这样一种方式来执行此操作,以便运行测试的JVM将其提取出来。这取决于你是如何运行Surefire的。

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

如果您将Surefire设置为fork,那么您可能认为可以简单地将java.endorsed.dirs包含在systemPropertyVariables节中,如下所示:

代码语言:javascript
复制
<systemPropertyVariables>
  <java.endorsed.dirs>weWillGetToThisInAMoment</java.endorsed.dirs>
</systemPropertyVariables>

...but,这是错误的。原因是实际运行的程序称为ForkedBooter,并且ForkedBooter以编程方式设置单元测试的系统属性。也就是说,当ForkedBooter读取您的<systemPropertyVariables>节时,已经太晚了。

但是你可以在你的Surefire配置中使用,如下所示:

代码语言:javascript
复制
<configuration>
  <argLine>-Djava.endorsed.dirs=weWillGetToThisInAMoment</argLine>
</configuration>

现在,Surefire派生的虚拟机将正确设置其认可的目录。现在让我们来讨论一下要提供什么值。

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

下面是我使用的值:

代码语言:javascript
复制
${settings.localRepository}${file.separator}org${file.separator}glassfish${file.separator}main${file.separator}javaee-api${file-separator}javax.annotation${file.separator}${javaxAnnotationVersion}

Maven Maven保证将扩展到你本地的Maven存储库的值,lives.

  • ${file.separator}是在Maven属性中获取System.getProperty("file.separator")值的一种方式,我已经在the GlassFish artifact that bundles up the javax.annotation package as defined in Java EE 6上声明了一个<dependency>。所以我在这里构建了一条通向工件的路径。我还定义了一个名为3.1.2.

的属性javaxAnnotationVersion

完成所有这些操作后,当Surefire派生一个VM来运行您的单元测试时,认可的目录将被设置为本地Maven库中包含javax.annotation类的jar的目录,现在运行在进程中的嵌入式GlassFish将使用JavaEE6版本的javax.annotation类,而不是JavaSE6版本。我希望这能帮到你。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6439368

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档