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, возможно, у вас есть некоторая информация о:

  1. как я могу настроить 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] ------------------------------------------------------------------------
    
  2. почему интеграционные тесты выполняются mvn grails:test-app пройти и мимо mvn grails:exec -Dcommand=tests-app сбой и как это исправить? Мне понадобится команда exec для некоторых конкретных целей, и я хочу иметь возможность полагаться на нее. Это моя самая большая проблема, я совершенно не понимаю, что может быть причиной

  3. Зачем mvn grails:tests-app результаты в выполнении двойных тестов?
  4. почему мне нужно добавить 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...
    

Спасибо всем, кто зашел так далеко и все еще читает - независимо от того, можете ли вы помочь или нет:)

Том

0 ответов

Другие вопросы по тегам