@PostConstruct方法在使包含EJB的模块成为另一个模块的依赖时调用两次

时间:2017-11-05 23:31:05

标签: java maven java-ee

我的maven项目结构如下所示:

test_project-parent
  |test_project-ejb.jar
  |test_project-depl.jar
  |test_project-web.war
  |test_project-ear.ear

我的3个模块:ejb,depl和web被打包到EAR中。

我的ejb模块中有一个EJB,如下所示:

@Startup
@Singleton
public class StartupBean {

    @PersistenceContext
    private EntityManager em;

    @PostConstruct
    private void sayHello () {
        System.out.println("HELLO !!!");
    }
    }

我的问题是sayHello()方法执行了两次。

这里是日志的输出:

00:16:13,803 INFO  [stdout] (ServerService Thread Pool -- 113) HELLO !!!
00:16:13,803 INFO  [stdout] (ServerService Thread Pool -- 117) HELLO !!!

我的ejb模块是我的网络模块的依赖项。

当我删除依赖项时,它工作正常(该方法被调用一次)。

我的网络模块的pom.xml如下所示:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.testing</groupId>
        <artifactId>test_project</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <artifactId>test_project-web</artifactId>
    <packaging>war</packaging>

    <dependencies>
        <dependency>
            <groupId>${project.groupId}</groupId>
            <artifactId>test_project-ejb</artifactId>
            <version>${test_project.version}</version>
        </dependency>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
        </dependency>
    </dependencies>

</project>

注意:我已阅读所有相关帖子但未找到答案

1 个答案:

答案 0 :(得分:1)

我发现了我的错误。我需要将依赖关系的范围更改为提供,因为依赖关系的方式被打包在war文件夹的lib文件夹中。所以,基本上,我的ejb模块已经部署了两次,因此是@PostConstruct方法的双重执行。

我在我的web模块pom.xml中的ejb依赖项中添加了<scope>provided</scope>,一切正常。 ejb模块不再打包在war存档的lib文件夹中,而@PostConstruct方法只调用一次。