Grails - строительный модульный проект с Maven
Я разрабатываю приложение Grails 2.3.4 и пытаюсь добавить maven (3.1.1) для целей сборки. Я делаю это потому, что мой проект модульный (2 плагина, 1 приложение - на данный момент будет гораздо больше плагинов), и я хотел бы иметь инструмент, который его поддерживает (мне не удалось использовать Gradle, но это совершенно другая тема). Недавно я обнаружил некоторые проблемы, которые я не понимаю и которые причиняют боль моему мозгу. Буду очень признателен за любую помощь о них.
Моя структура проекта выглядит так:
my_project/
my_project-domain/ (plugin)
pom.xml
my_project-services/ (plugin)
pom.xml
my_project-webap/ (app)
pom.xml
pom.xml
Мой родитель pom.xml:
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>my.app.group</groupId>
<artifactId>myArtifactId</artifactId>
<packaging>pom</packaging>
<version>0.0.2</version>
<name>myArtifactId</name>
<properties>
<grails.version>2.3.4</grails.version>
<h2.version>1.3.170</h2.version>
</properties>
<repositories>
...
</repositories>
<modules>
<module>my_project-domain</module>
<module>my_project-services</module>
<module>my_project-webapp</module>
</modules>
<dependencies>
<!-- MONGODB -->
<dependency>
<groupId>org.grails.plugins</groupId>
<artifactId>mongodb</artifactId>
<version>1.3.0</version>
<scope>compile</scope>
<type>zip</type>
<exclusions>
<!-- proper spring-core and spring-beans version included by org.grails:grails-plugin-services -->
<exclusion>
<artifactId>spring-core</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
<exclusion>
<artifactId>spring-beans</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<!-- TOMCAT needed during testing -->
<dependency>
<groupId>org.grails.plugins</groupId>
<artifactId>tomcat</artifactId>
<version>7.0.47</version>
<scope>provided</scope>
<type>zip</type>
</dependency>
<!-- without h2 TOMCAT throws DataSource errors -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>${h2.version}</version>
<scope>test</scope>
</dependency>
<!-- GRAILS dependencies-->
<dependency>
<groupId>org.grails</groupId>
<artifactId>grails-plugin-async</artifactId>
<version>${grails.version}</version>
</dependency>
...
</dependencies>
<build>
<pluginManagement/>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
...
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
...
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-clean-plugin</artifactId>
...
</plugin>
<plugin>
<groupId>org.grails</groupId>
<artifactId>grails-maven-plugin</artifactId>
<version>${grails.version}</version>
<configuration>
<fork>true</fork>
<!-- for debugging <forkDebug>true</forkDebug> -->
</configuration>
<extensions>true</extensions>
...
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>tools</id>
...
</profile>
</profiles>
</project>
Пример дочернего pom.xml:
<?xml version="1.0" encoding="utf-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>my.app.group</groupId>
<artifactId>myArtifactId</artifactId>
<version>0.0.2</version>
<relativePath>..</relativePath>
</parent>
<groupId>my.app.group</groupId>
<artifactId>my_project-services</artifactId>
<packaging>grails-plugin</packaging>
<version>0.0.2</version>
<name>my_project-services</name>
<description>my_project-services</description>
<dependencies>
<dependency>
<groupId>org.grails.plugins</groupId>
<artifactId>rest</artifactId>
<version>0.8</version>
<scope>runtime</scope>
<type>zip</type>
</dependency>
</dependencies>
</project>
Я могу выполнить интеграционные тесты через:
- mvn test - (из родительского каталога или дочернего каталога), который выполняет только модульные тесты
- grails: test-app - (из дочернего каталога) - который выполняет модульные и интеграционные тесты
- mvn grails: test-app - (только из дочернего каталога), который выполняет модульные и интеграционные тесты, но выполняет их два раза вместо одного (u, i, а затем еще раз u, i)
- mvn grails: execute -Dcommand = test-app - (только из дочернего dir) - который выполняет модульные и интеграционные тесты в нужном количестве (u,i), НО во время интеграционных тестов некоторые из них неожиданно запускаются с ошибкой (!!!!) просто поражает воображение, почему..
Итак, если есть кто-то, кто пытался смешать Grails 2.3, возможно, у вас есть некоторая информация о:
как я могу настроить maven для запуска mvn grails: test-app из родительского pom, чтобы не иметь такого результата:
[INFO] Scanning for projects... [INFO] ------------------------------------------------------------------------ [INFO] Reactor Build Order: [INFO] [INFO] myArtifactId [INFO] my_project-domain [INFO] my_project-services [INFO] my_project-webapp [INFO] [INFO] ------------------------------------------------------------------------ [INFO] Building myArtifactId 0.0.2 [INFO] ------------------------------------------------------------------------ [INFO] [INFO] --- grails-maven-plugin:2.3.4:test-app (default-cli) @ myArtifactId --- |Loading Grails 2.3.4 |Configuring classpath |Running pre-compiled script . |Environment set to test ....... |Application metadata not found, please run: grails upgrade [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] [INFO] myArtifactId ..................................... FAILURE [7.116s] [INFO] my_project-domain ................................ SKIPPED [INFO] my_project-services .............................. SKIPPED [INFO] my_project-webapp ................................ SKIPPED [INFO] ------------------------------------------------------------------------ [INFO] BUILD FAILURE [INFO] ------------------------------------------------------------------------
почему интеграционные тесты выполняются
mvn grails:test-app
пройти и мимоmvn grails:exec -Dcommand=tests-app
сбой и как это исправить? Мне понадобится команда exec для некоторых конкретных целей, и я хочу иметь возможность полагаться на нее. Это моя самая большая проблема, я совершенно не понимаю, что может быть причиной- Зачем
mvn grails:tests-app
результаты в выполнении двойных тестов? почему мне нужно добавить h2 зависимость для Tomcat? В моих источниках данных у меня есть только конфигурация mongodb, и я хотел бы придерживаться только ее и не видеть ошибку ниже каждый раз, когда я выполняю интеграционные тесты:
|Completed 8 unit tests, 0 failed in 0m 2s ........pool.ConnectionPool Unable to create initial connections of pool. java.sql.SQLException: org.h2.Driver at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:254) at org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:182) ... Caused by: java.lang.ClassNotFoundException: org.h2.Driver at org.grails.launcher.RootLoader.findClass(RootLoader.java:147) at java.lang.ClassLoader.loadClass(ClassLoader.java:306) at org.grails.launcher.RootLoader.loadClass(RootLoader.java:119) at java.lang.ClassLoader.loadClass(ClassLoader.java:247) at java.lang.Class.forName0(Native Method) at java.lang.Class.forName(Class.java:249) at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:246) ... 331 more ........ |Running 4 integration tests...
Спасибо всем, кто зашел так далеко и все еще читает - независимо от того, можете ли вы помочь или нет:)
Том