Java 将bean传递到lib文件夹中的jar

Java 将bean传递到lib文件夹中的jar,java,maven,jakarta-ee,Java,Maven,Jakarta Ee,我们得到了具有以下结构的Java EE 7项目: app.ear META-INF application.xml lib framework.jar webapp.war core.jar jar是我们使用某种命令模式的框架 这就是它的工作原理。每个命令都有自己的ejb连接到它,用于执行所有业务逻辑。此命令ejb扩展了具有执行方法的CommandEJB类 例如,这是命令ejb的一个示例: public class cmdCreateBookEJB<T e

我们得到了具有以下结构的Java EE 7项目:

app.ear
  META-INF
    application.xml
  lib
    framework.jar
  webapp.war
  core.jar
jar是我们使用某种命令模式的框架

这就是它的工作原理。每个命令都有自己的ejb连接到它,用于执行所有业务逻辑。此命令ejb扩展了具有执行方法的CommandEJB类

例如,这是命令ejb的一个示例:

public class cmdCreateBookEJB<T extends cmdCreateBook> extends CommandEJB<T> {
@Override
public void execute() {
     //do something
}
}
问题是我们的框架,特别是CommandExecutorEJB(打包在lib文件夹中的framework.jar中)需要从core.jar了解ejb,以便它能够处理该命令。该框架中实际发生的是,我的示例中的特定命令ejb(cmdCreateBookEJB)被转换为CommandEJB,然后调用它的execute方法

问题是如何让框架了解命令EJB

我知道有一种选择是在ejb-jar.xml中使用核心jar模块名指定am env条目,然后在CommandExecuteEJB中使用@Resource来查找条目,然后使用JNDI查找来查找将转换为CommandBean的资源

但是,我不想使用ejb-jar.xml,因为我们正在使用ejb3.2,ejb-jar.xml不再是必需的了

编辑: 为了更好地解释这个jndi查找字符串在我的示例中的样子:
java:app/core.jar/cmdCreateBookEJB

因为框架不知道也不应该知道core.jar(core.jar名称只是一个示例,有人可以将其命名为BookStoreCore.jar),所以我需要以某种方式传递模块名(在我的示例core.jar中),以便框架知道在何处查找类以找到特定的命令EJB,在我的示例cmdCreateBookEJB中

我知道我可以使用ejb-jar.xml中的env var将模块名传递给框架。下面是一个例子:

<session>
            <ejb-name>CommandExecutorEJB</ejb-name>
            <ejb-class>com.mypackage.CommandExecutorEJB</ejb-class>
            <session-type>Stateless</session-type>
            <env-entry>
                <env-entry-name>com.mypackage.CommandExecutorEJB/moduleName</env-entry-name>
                <env-entry-type>java.lang.String</env-entry-type>
                <env-entry-value>core</env-entry-value>
            </env-entry>
        </session>

命令执行器EJB
com.mypackage.CommandExecutorEJB
无国籍
com.mypackage.CommandExecutorEJB/moduleName
java.lang.String
核心

但是,我希望从我们的项目设置中删除ejb-jar.xml,因为您使用的是JavaEE7

通过将所有内容都放在WAR文件中,可以完全避免类可见性问题
core.jar
framework.jar
都可以添加到WEB-INF/lib目录中


然后,您可以在需要EJB的地方直接注入它们。

我不确定您是否正确理解了我的问题。也许我没有解释清楚。我的问题是framework.jar需要了解尚未创建的EJB。在我的示例中,框架不知道将创建cmdCreateBookEJB,但它需要它来执行命令。我知道我可以使用ejb-jar.xml在一个env变量中传递我核心的模块名,然后通过jndi查找资源。例如,路径可能是java:app/core.jar/cmdCreateBookEJB,但我希望避免这种情况,并以某种方式动态地注入框架,或者至少不指定模块名。您有一个更基本的问题,即
core.jar
中的EJB类对
framework.jar
不可见(除非它们都是通过框架中声明的接口引用的)。您需要显示更多代码,因为我怀疑您也需要利用CDI。
<session>
            <ejb-name>CommandExecutorEJB</ejb-name>
            <ejb-class>com.mypackage.CommandExecutorEJB</ejb-class>
            <session-type>Stateless</session-type>
            <env-entry>
                <env-entry-name>com.mypackage.CommandExecutorEJB/moduleName</env-entry-name>
                <env-entry-type>java.lang.String</env-entry-type>
                <env-entry-value>core</env-entry-value>
            </env-entry>
        </session>