我最近遇到了glassfish standalone(v3.1)vs glassfish embedded(v3.1)vs
java SE以及
java.endorsed.dirs的使用方式的问题.我遇到的具体问题是
here,但我认为这不是我最后一次遇到类似问题.
我在here和here找到的信息建议在编译时将glassfish认可的lib添加到bootstrap类路径中.但是,this错误报告表明在使用glassfish嵌入时很难正确设置已认可的库.
因此,似乎当我部署到一个独立的glassfish容器时,我的应用程序将针对glassfish包含的认可库运行,但是当使用嵌入式容器时它不会.我遇到了我原来的问题,因为maven-embedded-glassfish-plugin没有启动使用像glassfish独立的认可库这样嵌入的glassfish.我也不确定其他容器(例如:jboss)是否包含与glassfish相同的一组认可库.
所以,我(1)应该努力(很多)确保我的应用程序是针对认可的lib编译的,并且总是部署到使用被认可的libs引导的容器中,或者我应该(2)只是坚持使用捆绑的东西使用Java SE 6?
如果我选择(2),在将应用程序部署到使用较新的认可库进行自举的容器时,是否需要担心不兼容问题?
我很感激任何人都可以提供的任何见解.
解决方法
我可能会遗漏一些明显的东西,但是……不是GlassFish Embbeded附带了与Java EE规范兼容的库吗?并不是默认加载的那些库? (如果不是,请填写错误:
http://java.net/jira/browse/EMBEDDED_GLASSFISH).
我的意思是:您应该针对Java EE规范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>
这几乎是您针对Java EE 6 API编译项目所需的全部内容.任何符合Java EE 6的App Server都应该提供这些服务,您不应该担心它们如何使它可供您的应用程序使用.
引导Java EE服务的责任应该是您的App Server.如果你尝试自己的“内部”解决方案,JAR Hell可能会破裂.
干杯,