在appclient jar中包含模型库

时间:2011-07-11 19:30:36

标签: glassfish-3 ejb-3.1

我正在将带有EJB的耳朵部署到glassfish 3.1上,我想使用appclient脚本调用它。 EJB有一个方法,其参数是一个模型对象,它在一个单独的库中定义。

如果我想使用appclient脚本,我有一个Main类,它有一个调用EJB的main方法。 这也被放入一个单独的罐子里,它也被装在玻璃鱼上。

由于模型对象位于一个单独的库中,我需要它在客户端jar中,但也需要在EJB中。 所以我需要在客户端jar中以某种方式引用它。

客户端jar是一个jar(duh)所以我不能添加其他jar。 Java EE 6文档说我应该用lib创建一个ear,但如果我这样做它就不会部署,因为ear需要至少一个ejb或web模块而我的客户端lib都没有。

我发现的解决方案是使用程序集插件/ jar-with-dependencies。这个插件创建一个新jar,它包含所有依赖项的所有类。

这个解决方案有效,但我想知道这是不是要走了,或者我错过了一些明显的东西,因为我无法想象这是必需的。 EJB通常将模型对象作为参数,因此这种情况会发生很多。

所以我的问题是:有没有办法告诉glassfish引用app client jar和ejb jar之间的共享库。

1 个答案:

答案 0 :(得分:0)

我这样做是这样的:

  • 将Maven项目与模型分开。在我的例子中,有一堆简单的POJO,包含JPA和JAX-B注释,一些常量等。在Maven中,我通过指定<packaging>bundle</packaging>将其定义为 OSGi包。我将此项目称为MyAppInterface
  • 为需要处理模型的其他元素分离Maven项目。就我而言,我有一个带有EJB,数据库外观,REST servlet的Java EE应用程序;我有一个只进行测试的Integration-Test项目; GWT申请; etc ...在那些项目中,我指定了对模型的依赖:

    <dependency>
        <groupId>com.skalio</groupId>
        <artifactId>MyAppInterface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>
    
  • MyAppInterface部署到Glassfish时,我使用以下语法:

asadmin deploy --type osgi --name MyAppInterface /path/to/MyAppInterface-1.0-SNAPSHOT.jar

  • 我理解这是将模型放在Glassfish的类路径上,类似于mysql-connector,只有OSGi风格。

我允许所有这些项目由中央jenkins CI服务器构建,该服务器将工件部署到我们的内部maven存储库。然后,我们在每个项目的pom.xml中添加内部存储库。因此,每个人都自动使用最新的稳定MyAppInterface,即使他们没有在NetBeans / Eclipse中检出代码。

如果您需要更多示例,请与我们联系。