exec-maven-plugin挂起执行Java主类

时间:2018-05-09 09:16:53

标签: java hibernate maven

很长一段时间,我在java中有一个小应用程序,它使用hibernate SchemaExport来获取文件中的所有实际数据库结构。这与Hibernate 4.X一起工作正常。

基本上我在java Main.class中执行:

hibernateConfiguration.setProperty("hibernate.hbm2ddl.auto", "create");
hibernateConfiguration.setProperty("hibernate.dialect", dialect.getDialectClass());
hibernateConfiguration.setProperty("hibernate.connection.url", "jdbc:mysql://" + host + ":" + port + "/"
SchemaExport export = new SchemaExport(hibernateConfiguration);
export.setDelimiter(";");
export.setOutputFile(outputFile);
export.setFormat(true);
export.execute(false, false, false, true);

每次使用exec-maven-plugin执行项目时都会启动它:

<!-- Creates the database script BEFORE testing -->
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>exec-maven-plugin</artifactId>
    <version>1.6.0</version>
    <executions>
        <execution>
            <phase>compile</phase>
            <goals>
                <goal>java</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <mainClass>com.schemaexporter.main</mainClass>
        <!-- <skip>true</skip> -->
        <arguments>
            [...] <!-- Some database connection parameters -->
        </arguments>
    </configuration>
</plugin>

现在,我刚刚更新到Hibernate 5(5.2.17.Final)。为此,我已将代码更新为:

MetadataSources metadata = new MetadataSources(new StandardServiceRegistryBuilder().applySetting("hibernate.hbm2ddl.auto", "create")
    .applySetting("hibernate.connection.driver_class", dialect.getDriver())
    .applySetting("hibernate.dialect", dialect.getDialectClass())
    .applySetting("hibernate.connection.driver_class", dialect.getDriver())
    .applySetting("hibernate.connection.url", "jdbc:mysql://" + host + ":" + port + "/" + databaseName)
    .applySetting("hibernate.connection.username", username)
    .applySetting("hibernate.connection.password", password).build());

SchemaExport export = new SchemaExport();
export.setDelimiter(";");
export.setOutputFile(directory + File.separator + outputFile);
export.setFormat(true);
export.execute(EnumSet.of(TargetType.SCRIPT), SchemaExport.Action.CREATE, metadata.buildMetadata());

正确创建数据库脚本。但exec-maven-process挂起而不继续其他操作。对于悬挂,我指的是maven进程永远不会结束,不会继续下一阶段(执行单一测试)。

到目前为止我一直在尝试:

  • 添加到exec-maven-plugin选项<async>true</async>但没有任何变化。
  • System.exit(0)添加到Main类,但是maven被终止,而不是继续下一阶段。
  • 在bash中创建正在运行的脚本,为suggested here,并且进程返回Async process complete, exit value = 0但未生成数据库脚本。也许我可以深入了解脚本以找到错误,但这不是我的首选方式。

但是,我不明白为什么将Hibernate 4更改为Hibernate 5会导致进程无法结束。我已检查过代码(基本System.out无处不在),并且所有行都正确执行,直到结束但进程仍然有效。

有人知道Hibernate 5是否存在导致这种不良行为的行为改变?

1 个答案:

答案 0 :(得分:0)

如果我使用maven-antrun-plugin执行相同的类似乎maven继续执行。

<plugin>
    <artifactId>maven-antrun-plugin</artifactId>
    <version>1.8</version>
    <executions>
        <execution>
            <phase>compile</phase>
            <configuration>
                <target>
                    <java failonerror="true" classname="com.schemaexporter.main">
                        <arg value="databaseName" />    
                        <classpath refid="maven.compile.classpath" />
                    </java>
                </target>
            </configuration>
            <goals>
                <goal>run</goal>
            </goals>
        </execution>
    </executions>
</plugin>

这不是问题的答案,而是一个很好的解决方法。