我最近遇到了一个关于glassfish standalone (v3.1)、glassfish embedded (v3.1)和java以及java.endorsed.dirs使用方式的问题。我遇到的具体问题是here,但我不认为这是我最后一次遇到类似的问题。
我找到的here和here的信息建议在编译时将glassfish背书库添加到引导类路径中。然而,this错误报告表明,在使用glassfish嵌入时,很难正确设置批注的库。
所以,似乎当我部署到一个独立的glassfish容器时,我的应用程序将运行在glassfish包含的背书库上,但当使用嵌入式容器时,我遇到了我的原始问题,因为maven- embedded glassfish -plugin不能像glassfish standalone那样启动使用背书库嵌入的glassfish。我也不确定其他容器(例如: jboss)是否包含与glassfish相同的背书库。
那么,我(1)是应该努力(很大程度上)确保我的应用程序是根据背书库编译的,并且总是部署到使用背书库引导的容器中,还是应该(2)坚持使用Java SE 6捆绑的内容?
如果我选择(2),当我将我的应用程序部署到一个使用较新的背书库引导的容器时,我是否需要担心不兼容?
如果任何人能提供任何见解,我将不胜感激。
发布于 2011-06-26 07:34:06
我可能遗漏了一些明显的东西但是..。GlassFish Embbeded附带的库不是与Java规范兼容吗?这些库不是默认加载的吗?(如果它们不是,请在这里填充一个错误:http://java.net/jira/browse/EMBEDDED_GLASSFISH)。
我的意思是:您应该针对Java规范API进行编译,并让容器使用它自己的实现。
对于第一部分,如果您使用Maven,我喜欢Codehaus archetypes设置背书库的方式。它既干净又与应用程序服务器无关:
<properties>
<endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>..。
<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>..。
<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很有可能会崩溃。
干杯,
发布于 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节中,如下所示:
<systemPropertyVariables>
<java.endorsed.dirs>weWillGetToThisInAMoment</java.endorsed.dirs>
</systemPropertyVariables>...but,这是错误的。原因是实际运行的程序称为ForkedBooter,并且ForkedBooter以编程方式设置单元测试的系统属性。也就是说,当ForkedBooter读取您的<systemPropertyVariables>节时,已经太晚了。
但是你可以在你的Surefire配置中使用,如下所示:
<configuration>
<argLine>-Djava.endorsed.dirs=weWillGetToThisInAMoment</argLine>
</configuration>现在,Surefire派生的虚拟机将正确设置其认可的目录。现在让我们来讨论一下要提供什么值。
您希望精挑细选要覆盖的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 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版本。我希望这能帮到你。
https://stackoverflow.com/questions/6439368
复制相似问题