使用mvn jetty运行嵌入式H2数据库:运行

时间:2016-11-18 17:21:05

标签: java maven pom.xml h2

我一直试图弄清楚如何通过配置文件运行嵌入式数据库,并能够通过邮递员运行REST调用。 这就是我到目前为止所做的:

<profile>
        <id>developRest</id>
        <build>
        <plugins>
        <plugin>
           <groupId>org.codehaus.mojo</groupId>
            <artifactId>sql-maven-plugin</artifactId>
            <version>1.5</version>
            <dependencies>
                <dependency>
                    <groupId>com.h2database</groupId>
                    <artifactId>h2</artifactId>
                    <version>${h2.version}</version>
                </dependency>
            </dependencies>
            <configuration>
                <driver>org.h2.Driver</driver>
                <url>jdbc:h2:mem:test</url>
                <username>sa</username>
                <password>sa</password>
            </configuration>
            <executions>
                <execution>
                    <id>my-execution</id>
                    <goals>
                        <goal>execute</goal>
                    </goals>
                    <configuration>
                        <autocommit>true</autocommit>
                        <srcFiles>
                            <srcFile>src/test/resources/table-ddl.sql</srcFile>
                            <srcFile>src/test/resources/insert-into-table.sql</srcFile>
                        </srcFiles>
                    </configuration>
                </execution>
            </executions>
        </plugin>
            <plugin>
                <groupId>org.mortbay.jetty</groupId>
                <artifactId>jetty-maven-plugin</artifactId>
                <version>${jetty.version}</version>
                <configuration>
                    <webApp>
                        <descriptor>src/main/webapp/WEB-INF/jetty.xml</descriptor>
                    </webApp>
                    <stopKey></stopKey>
                    <stopPort></stopPort>
                </configuration>
            </plugin>
        </plugins>
        </build>
        <dependencies>
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>${h2.version}</version>
            </dependency>
        </dependencies>
    </profile>

我玩过各个阶段,但似乎没什么好看的。当我使用mvn sql:execute @ my-execution jetty:run运行时,servlet运行但是一旦我调用了rest方法,我就得到了

Failed to execute goal org.codehaus.mojo:sql-maven-plugin:1.5:execute (my-execution) on project myProject: The parameters 'driver', 'url' for goal org.codehaus.mojo:sql-maven-plugin:1.5:execute are missing or invalid 我错过了哪些会让驱动程序和网址有效?谢谢你的帮助。

更新:使用mvn -PdevelopRest sql:execute@my-execution jetty:run来摆脱驱动程序和网址错误,但仍然坚持:

### Error querying database.  Cause: org.h2.jdbc.JdbcSQLException: Table "myTable" not found; SQL statement:

从邮递员那里打电话给GET。有什么想法?

1 个答案:

答案 0 :(得分:1)

当您调用REST方法(Failed to execute goal ...)时,我发现很难相信您收到Maven错误。

除此之外,我认为您真正的问题是:您使用H2作为内存数据库,这意味着只要您的应用程序运行它就可用。当您的应用程序消失时,您的数据库也会消失。

在Maven的上下文中,您执行多个插件,数据库不会超过单个插件的执行。您的my-execution实例化一个内存数据库,然后它就会消失。 jetty-maven-plugin创建自己的内存数据库,然后没有任何进入上一个的DDL / SQL。

可能有很多方法可以解决这个问题,例如:

  1. 不要使用内存数据库,而是使用H2写出文件,例如jdbc:h2:/data/test,或者,因为您正在使用Maven:jdbc:h2:${project.build.directory}/data/test
  2. 不要使用sql-maven-plugin初始化数据库,而是直接在应用程序内部。你可以这样做:

    1. 使用一些自定义代码,您只放置测试类路径
    2. 通过将DDL / SQL添加到应用程序的连接字符串(“Execute SQL on Connection”),如下所示:

      jdbc:h2:mem:test;INIT=runscript from '~/table-ddl.sql'\\;runscript from '~/insert-into-table.sql'";
      
  3. H2是一个很棒的数据库。祝你好运!