2014-05-24 112 views
2

我在部署我的Java EE应用程序时遇到了一些问题,并且可能会使用一些建议。
我有3个组件来部署:Java EE部署问题

  • 集成层(数据):POJO和CDI豆类 - JAR文件
  • 应用层(BL):的EJB,CDI豆类和POJO - JAR文件
  • 演示层:Servlets和这样的 - WAR文件

理想情况下,我希望能够在同一个Java EE服务器同时部署的集成和应用层的JAR,而是作为独立的JAR文件(因为我可能要改变硬件配置稍后和将它们分成两台不同的机器上的两台不同的服务器)。
问题是,我无法从集成层JAR中将CDI注入从应用程序层JAR中取得工作。服务器说(并且可能是这样),解决注入是不可能的。

到目前为止,我想出了这些可能的解决方案:

  • 包的两个JAR成一个单一的EAR文件(在WAR也许奉送......),并部署
  • 使用JNDI在不同的层之间(可能创建一个CDI生产者根据JNDI名称或类似的东西进行通用注入)
  • 在集成层中,使对象注入应用层(DAO)EJB而不是CDI bean

我不喜欢这些解决方案(特别是最后一个),因为它们限制了我未来的部署选项。第二种解决方案并不限制我,但在某些时候(当我累积大量代码时)可能会变得乏味。

最后,我的问题是:
是否有一个选项,我没有找到呢,这将让我的两个JAR与CDI注射工作在同一台服务器上部署?如果在某些时候我可以将JAR分离到不同的服务器中,那么可能还会有效。

回答

2

是的,还有其他选项。

  1. 使用支持OSGi的java EE容器,并使用OSGi接口来实现您的部署依赖关系。至少Websphere,Glassfish,JBoss(安装了jbosgi),Jonas支持部署OSGi捆绑软件。这意味着你的模块应该被转换成OSGi包。

  2. 使用允许模块相互通信的容器特定扩展。 JBoss作为jboss-deployment-structure.xml,您可以使用它来依赖另一个部署。

  3. 为您的依赖项使用服务器提供的共享类路径。不会真的推荐这个。

我的投票将用于OSGi。

但是,如果您将软件包部署到不同的服务器,它们都不会自行工作。远程EJB,远程JNDI查找,Spring远程处理,基于HTTP的API,CORBA或类似的远程技术需要在不同的服务器之间进行。在Java EE中,EJB是事实上的标准,但是Spring Remoting也不错。


更新:您添加了使用TomEE服务器。事实上,TomEE不会支持我提到的前两种选择。在这种情况下,我将使用EJB--使用EJB的事实可以使用EJB委托从业务层抽象出来,并且可以仅将EJB(无状态会话Bean)用于接口部分,将DAO作为POJO 。

+0

我在TomEE服务器上部署,我认为它不支持这两个选项中的任何一个。我也希望保持独立于服务器选择的东西,以防以后更改服务器。我意识到EJB是实现这一目标的方式,我唯一担心的是从我的集成层迁移到我的应用程序层的对象是DAO,出于某种原因,我认为使它们成为EJB似乎是错误的。我错了吗 ? – eitanfar

+1

@eitanfar如果你为此使用EJB,那么它就是你的接口层,应该是EJB(无状态会话bean),而不是DAO本身!我实现这个的方式是为接口 - >组件服务接口 - >组件服务实现 - >内部DAO提供一个EJB层。这允许最大程度的解耦和我所需要关注的分离。另外,对于我所有的EJB,都有一个实际用于查找的单独EJB委托,所以EJB查找完成的事实对于应用程序层是不可见的。那么EJB委托可以用作POJO。 – eis

+1

我的确意识到这可能比你想要的更分层,当然这不是强制性的。 – eis

0

不知道你的目标是什么,但在部署一战是好的,甚至可以用以下命令手工完成:

mkdir -p webapps/myapp/WEB-INF/lib 
cp myjar*.jar webapps/myapp/WEB-INF/lib/ 

如果你的目标是能够分裂他们,你可以使用TomEE瘦战争特点。

用WEB-INF/jars.txt文件创建一场战争。

在这个jars.txt放置一行依赖/ jar。它可以是jar或maven坐标的路径。

设置完成后,您可以逐个更换JAR,然后重新启动服务器。当几个团队使用同一个二进制文件时,这非常棒。

TomEE有一些替代方案,但这个方法的优点是易于更换为便携式(战争)。