2014-03-02 72 views
0

我想同时使用插件hibernate3-maven-plugin和sql-maven-plugin。 我的目标是,我可以运行 “maven的产生来源”,它应该做的:Maven hibernate3 + sql插件执行顺序

1)Hibernate3中,Maven的插件生成init.sql

2)SQL-Maven的插件执行它(的其他一些脚本)

我配置的问题是: 如果我运行产生来源,只有-Maven的插件Hibernate3的工作原理,并生成日init.sql但我试着运行这两个插件它将运行SQL-先插入maven-plugin

并以e RROR:

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> 

UPDATE

其实我不想我的生成过程中运行SQL。 我只想为其他开发人员设置一个简单的方法来将其数据库重置为最新的数据库模式并使用testData进行填充​​。 到底我应该这样MVN运行:MVN Hibernate3的:就是hbm2ddl SQL:执行

同时执行插件

我tryed以消除双方处决<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但doen't执行什么:

[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

为什么你想运行SQL作为构建脚本的一部分?为什么在生成资源阶段?就此而言,休眠生成应该放在生成资源中,而不是生成源中。如果你希望你的sql作为集成测试的一部分来执行(这是唯一有意义的选择),把它放到准备集成测试阶段。 – blackbuild

+0

另外:哪个maven版本(插件执行顺序改变),你有执行你的插件在父pom中定义(在这种情况下,这将解释错误的顺序) – blackbuild

+0

我使用嵌入在eclipse中的maven:3.0.4,我更新了关于您的第一条评论 – jpprade

回答

0

既然你不想运行处决你经常构建的一部分,但为了方便开发人员,请使用默认的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
+0

的问题,谢谢我不知道有关默认cli ID。 如果我对同一个插件有2次执行会怎么样?两个执行都可以有相同的ID吗? – jpprade

+0

@jpprade不,执行ID必须是唯一的。但只要两个调用的配置不冲突(对同一个参数使用不同的值),就可以简单地将两者都包含在执行的配置中。当然,你仍然必须在命令行列出两个目标。 – blackbuild