2016-11-18 10 views
0

Я пытаюсь выяснить, как запустить встроенную базу данных через профиль и иметь возможность запускать REST-вызовы через почтмана. Это то, что я до сих пор:Запуск встроенной базы данных H2 с mvn jetty: запустите

<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> 

Я играл с фазами, но на самом деле ничего не кажется, придерживаться. Когда я запускаю это с МВНАМИ SQL: выполнить @ мой-исполнение причалу: бег, пробеги сервлет, но когда я вызываю метод остального я получаю

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, чтобы быть действительными? Спасибо за вашу помощь.

Update: Используется mvn -PdevelopRest sql:[email protected] jetty:run, чтобы избавиться от ошибки водителя и URL-адрес, но все еще застряли:

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

При вызове GET от почтальона. Есть предположения?

ответ

0

Мне трудно поверить, что вы получаете ошибку Maven при вызове метода REST (Failed to execute goal ...).

В целом, я думаю, что ваша настоящая проблема заключается в следующем: вы используете 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'"; 
      

H2 является удивительным базы данных. Удачи!

+0

В результате я не использовал базу данных в памяти. Я действительно надеялся, что смогу (так как это так удобно!). Но вы правы в том, что это не сохраняется, на что я надеялся, что смогу понять. Спасибо за ваш совет. Ошибка Maven появляется из-за попытки подключения к базе данных в режиме остального вызова. Но поскольку я переключился на использование сервера H2 и подключился к нему, я больше не получаю эту ошибку, так как db сохраняется. Еще раз спасибо! – Kevin