处理Java EE和java.endorsed.dirs的最佳实践?

Rya*_*n J 7 glassfish java-ee glassfish-embedded

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

我在这里这里找到的信息建议在编译时将glassfish认可的lib添加到bootstrap类路径.但是,这个错误报告表明,当使用嵌入的glassfish时很难正确设置认可的库.

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

所以,我(1)应该努力(很多)确保我的应用程序是针对认可的lib编译的,并且总是部署到使用已认可的libs引导的容器中,或者我应该坚持使用捆绑的内容使用Java SE 6?

如果我选择(2),在将应用程序部署到使用较新的背书库进行自举的容器时,是否需要担心不兼容问题?

我很感激任何人都能提供的见解.

Ant*_*oly 2

我可能在这里遗漏了一些明显的东西,但是...GlassFish Embeded 不是附带与 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>
Run Code Online (Sandbox Code Playgroud)

...

<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>
Run Code Online (Sandbox Code Playgroud)

...

<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>
Run Code Online (Sandbox Code Playgroud)

这几乎是您根据 Java EE 6 API 编译项目所需的全部内容。任何符合 Java EE 6 的应用程序服务器都应该提供这些服务,并且您不应该担心它们如何将其提供给您的应用程序。

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

干杯,