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

Posted

技术标签:

【中文标题】使用 mvn jetty:run 运行嵌入式 H2 数据库【英文标题】:Running embedded H2 database with mvn jetty:run 【发布时间】:2016-11-18 17:21:04 【问题描述】:

我一直试图弄清楚如何通过配置文件运行嵌入式数据库并能够通过邮递员运行 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 方法,我就会得到 ​​p>

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 我缺少什么会使驱动程序和 url 有效?谢谢你的帮助。

更新:使用mvn -PdevelopRest sql:execute@my-execution jetty:run 摆脱驱动程序和 url 错误但仍然卡住:

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

从邮递员那里调用 GET 时。有什么想法吗?

【问题讨论】:

【参考方案1】:

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

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

在执行多个插件的 Maven 环境中,数据库不会比单个插件的执行寿命长。你的my-execution 实例化了一个内存数据库,然后它就消失了。 jetty-maven-plugin 创建了自己的内存数据库,该数据库没有任何进入前一个数据库的 DDL/SQL。

可能有多种方法可以解决此问题,例如:

    不要使用内存数据库,而是让 H2 写出文件,例如jdbc:h2:/data/test,或者,因为您使用的是 Maven:jdbc:h2:$project.build.directory/data/test

    不要使用sql-maven-plugin 初始化数据库,而是直接在应用程序内部。你可以这样做:

      使用一些自定义代码,您只需要放在测试类路径中

      通过将 DDL/SQL 添加到应用程序的连接字符串 ("Execute SQL on Connection"),如下所示:

      jdbc:h2:mem:test;INIT=runscript from '~/table-ddl.sql'\\;runscript from '~/insert-into-table.sql'";
      

H2 是一个很棒的数据库。祝你好运!

【讨论】:

我最终没有使用内存数据库。我真的希望我能(因为它很方便!)。但你是对的,它不会持续存在,我希望我能弄清楚。谢谢你的建议。由于尝试在 rest 调用中连接到数据库而弹出 Maven 错误。但是自从我切换到使用 H2 服务器并连接到该服务器后,我不再收到该错误,因为数据库仍然存在。再次感谢!

以上是关于使用 mvn jetty:run 运行嵌入式 H2 数据库的主要内容,如果未能解决你的问题,请参考以下文章

使用 jetty:run 时运行资源过滤器

如何使用由 Maven 坐标定义的战争来运行 jetty:run-war?

Maven 中的空闲堆大小不会增加

Jetty Run War 仅使用命令行

嵌入式 h2 数据库未运行

使用嵌入式 H2 数据库进行测试 - 导入数据正常,运行测试时,它会再次尝试初始化数据,然后找不到表