【问题标题】:How to remove ear name from the JNDI name如何从 JNDI 名称中删除耳朵名称
【发布时间】:2014-04-10 21:53:10
【问题描述】:

我有一个 ear 构建 pom 构建 api、ejb 和核心 java 模块。但是当我部署并启动 JBoss 时,它会部署带有耳朵名称的 ejb JNDI 名称。例如JNDI 名称是server-component-ear-0.0.1-SNAPSHOT/MyServiceBean/local

这里的 MyServiceBean 是我想从 JNDI 视图中查找的 ejb。它在 ejb 模块内。我最后的耳朵名字是server-component-ear-0.0.1-SNAPSHOT.ear 其中包含

-lib
-META-INF
-server-component-ejb-0.0.1-SNAPSHOT.jar
-server-component-core-0.0.1-SNAPSHOT.jar

听到我的earpom文件

    <parent>
    <groupId>xxx.group.abc</groupId>
    <artifactId>component-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    </parent>
    <name>COMPONENT EAR</name>
    <artifactId>server-component-ear</artifactId>
    <packaging>ear</packaging>
    <dependencies>
      <dependency>
        <groupId>xxx.group.abc</groupId>
        <artifactId>component-ejb</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>ejb</type>
         <exclusions>
            <exclusion>
                <groupId>xxx.group.xyz</groupId>
                <artifactId>some.artifact</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>xxx.group.abc</groupId>
        <artifactId>server-component-core</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <type>jar</type>
    </dependency>
   </dependencies>
   <build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-ear-plugin</artifactId>
            <version>2.8</version>
            <configuration>
                <defaultLibBundleDir>lib</defaultLibBundleDir>
                 <modules>
                     <jarModule>
                        <groupId>xxx.group.abc</groupId>
                        <artifactId>component-core</artifactId>
                        <bundleDir>/</bundleDir>
                        <includeInApplicationXml>true</includeInApplicationXml>
                    </jarModule>
                 </modules>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
        </plugin>
    </plugins>
     <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.eclipse.m2e</groupId>
                <artifactId>lifecycle-mapping</artifactId>
                <version>1.0.0</version>
                  <configuration>
                    <lifecycleMappingMetadata>
                        <pluginExecutions>
                            <pluginExecution>
                                <pluginExecutionFilter>
                                    <groupId>org.apache.maven.plugins</groupId>
                                    <artifactId>maven-ear-plugin</artifactId>
                                    <versionRange>[2.8,)</versionRange>
                                     <goals>
                                        <goal>generate-application-xml</goal>
                                    </goals>
                                </pluginExecutionFilter>
                                <action>
                                    <ignore></ignore>
                                </action>
                            </pluginExecution>
                        </pluginExecutions>
                    </lifecycleMappingMetadata>
                </configuration>
            </plugin>
           </plugins>
         </pluginManagement>
    </build>

我用来运行maven build 以创建ear 的服务器组件pom 文件。

<name>SERVER COMPONENT</name>

<groupId>xxx.group.abc</groupId>
<artifactId>server-component-parent</artifactId>
<packaging>pom</packaging>
<version>0.0.1-SNAPSHOT</version>

<modules>
    <module>api</module>
    <module>ejb</module>
    <module>core</module>
    <module>ear</module>
</modules>
<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
            <version>1.1.3</version>
        </dependency>
    </dependencies>
</dependencyManagement>
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-release-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-source-plugin</artifactId>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-javadoc-plugin</artifactId>
        </plugin>
    </plugins>
    <pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.0</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <encoding>UTF-8</encoding>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-source-plugin</artifactId>
                <version>2.2.1</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-javadoc-plugin</artifactId>
                <version>2.9</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

这是ear中的application.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE application PUBLIC
"-//Sun Microsystems, Inc.//DTD J2EE Application 1.3//EN"
"http://java.sun.com/dtd/application_1_3.dtd">
<application>
  <display-name>server-component-ear</display-name>
  <module>
     <java>server-component-core-0.0.1-SNAPSHOT.jar</java>
  </module>
  <module>
     <ejb>server-component-ejb-0.0.1-SNAPSHOT.jar</ejb>
  </module>
</application>

我怎样才能让它工作,因为 JNDI 名称只能是 MyServiceBean/local

【问题讨论】:

    标签: java maven jakarta-ee jboss ear


    【解决方案1】:

    我不知道我是否完全理解您的问题,但请记住,当部署会话 bean 时,服务器会使用 预定义语法将其绑定到 JNDI 名称。

    看来你使用的是ejb 3.1,如果是这样你可以看到完整的语法描述here(见第4章4.4全局JNDI访问。)

    JBoss 作为一个符合 Java EE 的服务器遵循规范所说的,这就是你的组件以这种方式绑定的原因。 据我所知,您无法更改 JNDI 绑定名称语法。

    【讨论】:

    • 感谢您的回复,我了解它在耳朵环境中的调用方式。我的问题是昨天我将我的项目从 jar 转换为 ear。当我使用 jar 时,我能够按名称查找 bean。像“ MyServiceBean/local ” 但是用耳朵我不能再这样做了。那是我的问题。我没有在我的 bean 和接口中提到 '@name' 和 '@mappedName' 注释。因此,如果我定义了那些,我应该能够定义我自己的 JNDI 名称,是吗?
    • 我尝试了很多方法。你能指导我如何定义我自己的 JNDI 名称来查找吗?我不能使用 ejb jar 名称来查找 jndi。我使用注释并且也没有 ejb-jar.xml。我的解决方案是什么?
    • 我认为这是不可能的,如果您现在有耳朵,我认为最好的选择是更改 jndi 名称,包括其中的耳朵名称。可能是this链接可以帮助你
    • 这很糟糕。不是吗?当我们更改 ear 版本时,我们需要更改 java 文件来查找 bean。这就是整个世界的运作方式吗?
    【解决方案2】:

    我能够解决这个问题。 This link 帮我试试。我所做的是将"java:module/" 添加到jndi 查找的前面,以便它从module 开始读取bean。该链接将有助于更清楚地理解它。另请注意,我在最后删除了/local。现在我只查找bean。 IService interface 被两个不同的beans 使用,现在没有任何问题。

    这就是我从 Java SE client 查找 bean 的方式。

    String   jndi = "MyService" // this is a run time parameter. Can be 'MyAnotherService' 
    IService bean = (IService) initialContext.lookup("java:module/"+jndi+"Bean");
    

    而且我没有更改bean 类中的任何注释。因为更改 jndi 名称对我没有任何帮助。 :(

     @Local
     public interface IService { // interface}
    
    
     @Stateless
     public class MyServiceBean implements IService { // bean 1}
    
    
     @Stateless
     public class MyAnotherServiceBean implements IService { // bean 2}
    

    现在我不再依赖耳朵或我的 ejb jar 名称。 感谢加布里埃尔的帮助!!!

    【讨论】:

    【解决方案3】:

    我能够以另一种方式克服这个问题。 我已经配置了 maven ear 插件来创建无版本模块。

    <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-ear-plugin</artifactId>
        <version>2.3.2</version>
        <configuration>
            <version>5</version>
            <defaultLibBundleDir>/lib</defaultLibBundleDir>
            <generateApplicationXml>true</generateApplicationXml>
            <finalName>appName-ear</finalName>
            <modules>
                <ejbModule>
                    <groupId>com.abc</groupId>
                    <artifactId>appName-ejb</artifactId>
                    <bundleFileName>appName-ejb</bundleFileName>
                </ejbModule>
                <webModule>
                    <groupId>com.abc</groupId>
                    <artifactId>appName-web</artifactId>
                    <bundleFileName>appName-web</bundleFileName>
                </webModule>
            </modules>
        </configuration>
    </plugin>
    

    【讨论】:

    • 哇,完全忽略了这一点,忘记了 Maven 耳朵配置,正是我需要的,感谢日志@kqr!
    猜你喜欢
    • 2011-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-19
    • 2016-07-24
    • 2014-04-11
    • 2014-12-24
    • 1970-01-01
    相关资源
    最近更新 更多