exec-maven-plugin зависает при выполнении основного класса Java - PullRequest
0 голосов
/ 09 мая 2018

В течение долгого времени у меня есть небольшое приложение в 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) в основной класс, но maven убит и не переходит к следующим фазам.
  • Создание работающего скрипта в bash, как предложено , здесь , и процесс возвращает Async process complete, exit value = 0, но скрипт базы данных не генерируется. Может быть, я могу углубиться в сценарий, чтобы найти ошибку, но это не мой предпочтительный путь.

Тем не менее, я не понимаю, почему изменение Hibernate 4 на Hibernate 5 приводит к тому, что процесс не завершается. Я проверил код (базовый System.out везде), и все строки выполняются правильно до конца, но процесс все еще жив.

Кто-нибудь знает, есть ли изменение поведения в Hibernate 5, которое вызывает это нежелательное поведение?

1 Ответ

0 голосов
/ 09 мая 2018

Если я выполняю тот же класс, используя 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>

Это не совсем ответ на вопрос, но хороший обходной путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...