【问题标题】:Maven hibernate3 + sql plugin execution orderMaven hibernate3 + sql插件执行顺序
【发布时间】:2014-04-03 09:06:19
【问题描述】:

我正在尝试同时使用插件 hibernate3-maven-plugin 和 sql-maven-plugin。 我的目标是我可以运行“maven generate-sources”并且应该这样做:

1) hibernate3-maven-plugin 生成init.sql

2) sql-maven-plugin 执行它(一个其他脚本)

我的配置问题是: 如果我只使用 hibernate3-maven-plugin 运行 generate-sources 它可以工作并生成 th init.sql 但我尝试运行这两个插件它将首先运行 sql-maven-plugin

并以错误结束:

Caused by: org.apache.maven.plugin.MojoExecutionException: /my/path/src/main/resources/sql/init.sql not found.

这是我的插件配置:

<plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>hibernate3-maven-plugin</artifactId>
        <version>3.0</version>
        <dependencies>                  
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.13</version>
            </dependency>
        </dependencies>
        <executions>
            <execution>
                <id>create-script</id>
                <phase>generate-sources</phase>
                <goals>
                    <goal>hbm2ddl</goal>
                </goals>
                <configuration>
                    <hibernatetool destdir="${project.basedir}/src/main/resources/sql/">
                        <classpath>
                            <path location="${project.basedir}/src/main/java" />
                        </classpath>
                        <configuration
                            configurationfile="${project.basedir}/src/main/resources/hibernate/hibernate-mysql.cfg.xml" />
                        <hbm2ddl create="true" drop="true" export="false"
                            outputfilename="init.sql" format="true" console="true" />
                    </hibernatetool>
                </configuration>
            </execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>sql-maven-plugin</artifactId>
        <version>1.5</version>
        <dependencies>                  
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.13</version>
            </dependency>
        </dependencies>
        <configuration>
            <driver>com.mysql.jdbc.Driver</driver>
            <url>jdbc:mysql://localhost/MYDB</url>
            <username>root</username>
            <password>root</password>
        </configuration>
        <executions>
            <execution>
                <id>init-db</id>
                <phase>generate-sources</phase>
                <goals>
                    <goal>execute</goal>
                </goals>
                <configuration>
                    <autocommit>true</autocommit>
                    <srcFiles>
                        <srcFile>src/main/resources/sql/init.sql</srcFile>
                        <srcFile>src/main/resources/sql/insertMessages.sql</srcFile>
                    </srcFiles>
                </configuration>
            </execution>
        </executions>
    </plugin>            
</plugins>

更新

事实上,我不想在构建过程中运行 sql。 我只想为其他开发人员设置一种简单的方法,将他们的数据库重置为最新的数据库模式并填充 testData。 最后我应该像这样运行 mvn:mvn hibernate3:hbm2ddl sql:execute

同时执行两个插件

我尝试在两次执行中删除&lt;phase/&gt;,但也出现错误:

ERROR] Failed to execute goal org.codehaus.mojo:hibernate3-maven-plugin:3.0:hbm2ddl (default-cli) on project DideuroDb: There was an error creating the AntRun task. NullPointerException -> [Help 1]
org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:hibernate3-maven-plugin:3.0:hbm2ddl (default-cli) on project myProject: There was an error creating the AntRun task.

更新 2

这样的配置效果更好:

它生成 init.sql 但不执行任何操作:

[INFO] 0 of 0 SQL statements executed successfully
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

配置更新:

<plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>hibernate3-maven-plugin</artifactId>
        <version>3.0</version>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.13</version>
            </dependency>
        </dependencies>     
        <configuration>
            <hibernatetool destdir="${project.basedir}/src/main/resources/sql/">
                <classpath>
                    <path location="${project.basedir}/src/main/java" />
                </classpath>
                <configuration
                    configurationfile="${project.basedir}/src/main/resources/hibernate/hibernate-mysql.cfg.xml" />
                <hbm2ddl create="true" drop="true" export="false"
                    outputfilename="init.sql" format="true" console="true" />

            </hibernatetool>
        </configuration>
    </plugin>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>sql-maven-plugin</artifactId>
        <version>1.5</version>
        <dependencies>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>5.1.13</version>
            </dependency>
        </dependencies>
        <configuration>
            <driver>com.mysql.jdbc.Driver</driver>
            <url>jdbc:mysql://localhost/MYDB</url>
            <username>root</username>
            <password>root</password>
        </configuration>
        <executions>
            <execution>
                <id>init-db</id>
                <goals>
                    <goal>execute</goal>
                </goals>
                <configuration>
                    <autocommit>true</autocommit>
                    <srcFiles>
                        <srcFile>src/main/resources/sql/init.sql</srcFile>
                        <srcFile>src/main/resources/sql/insertMessages.sql</srcFile>
                    </srcFiles>
                </configuration>
            </execution>
        </executions>
    </plugin>       
</plugins>

【问题讨论】:

  • 为什么要将 sql 作为构建脚本的一部分运行?为什么在生成源阶段?就此而言,hibernate 生成应该放在 generate-resources 中,而不是 generate-sources 中。如果您希望将 sql 作为集成测试的一部分执行(这是唯一有意义的选项),请将其放入准备集成测试阶段。
  • 另外:哪个 maven 版本(插件执行顺序已更改)以及您是否在父 pom 中定义了插件的执行(在这种情况下是 sql,这将解释错误)
  • 我正在使用 Eclipse 中嵌入的 maven:3.0.4,我更新了关于您的第一条评论的问题

标签: maven maven-plugin


【解决方案1】:

由于您不想将执行作为常规构建的一部分运行,但为了方便您的开发人员,请使用 default-cli “magic”执行 ID(请参阅 https://maven.apache.org/guides/mini/guide-default-execution-ids.html)。所以不要在你的执行中既不包括阶段也不包括目标,并将其命名为“default-cli”。这样,它的配置只在手动调用mvn hibernate3:hbm2ddl sql:execute时使用:

<plugins>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>hibernate3-maven-plugin</artifactId>
        <version>3.0</version>
        <dependencies>
          ...
        </dependencies>
        <executions>
          <execution>
            <id>default-cli</id>
            <configuration>
              ...
            </configuration>
          <execution>
        </executions>
    </plugin>
    <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>sql-maven-plugin</artifactId>
        <version>1.5</version>
        <dependencies>
          ...
        </dependencies>
        <configuration>
            <driver>com.mysql.jdbc.Driver</driver>
            <url>jdbc:mysql://localhost/MYDB</url>
            <username>root</username>
            <password>root</password>
        </configuration>
        <executions>
            <execution>
                <id>default-cli</id>
                <configuration>
                    <autocommit>true</autocommit>
                    <srcFiles>
                        <srcFile>src/main/resources/sql/init.sql</srcFile>
                        <srcFile>src/main/resources/sql/insertMessages.sql</srcFile>
                    </srcFiles>
                </configuration>
            </execution>
        </executions>
    </plugin>       
</plugins>

这样,您的“手动”目标配置将永远不会干扰某些正常的生命周期配置。

还有两点:

  • 考虑始终将 init.sql 创建为构建的一部分,并将它们作为附加工件(使用分类器 sql)附加到您的项目中。以后可以更轻松地检索正确的 sql 到修订版
  • 请不要将你的sql生成到src/main/resources。这可能会导致开发人员工作区中的类和 sql 不匹配以及“幻像更改”。正确的生成位置在${project.build.directory} 下,通常是target/generated-resources/hibernate3

【讨论】:

  • 谢谢我不知道 default-cli id。如果我对同一个插件执行 2 次怎么办?两个执行可以有相同的 id 吗?
  • @jpprade 不,执行 ID 必须是唯一的。但只要两个调用的配置不冲突(对同一参数使用不同的值),您可以简单地将两者都包含在执行的配置中。当然,您仍然需要在命令行中列出这两个目标。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 1970-01-01
  • 2016-02-20
相关资源
最近更新 更多