Maven hibernate3 + sql插件执行顺序

时间:2014-03-02 12:50:37

标签: maven maven-plugin

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

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

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

我的配置问题是: 如果我只使用hibernate3-maven-plugin运行generate-sources,它可以生成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

执行两个插件

我尝试在两次执行中删除<phase/>,但也有错误:

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>

1 个答案:

答案 0 :(得分:0)

由于您不希望将执行作为常规版本的一部分运行,但为了方便开发人员,请使用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。这可能会导致未开发的类和sqls以及开发人员工作空间中的“幻像变化”。正确的生成地点位于${project.build.directory}下方,通常为target/generated-resources/hibernate3