web-dev-qa-db-fra.com

Comment puis-je inclure un bocal de test de dépendance dans un déploiement de projet Maven?

J'ai deux projets, foo et foo-web sous le com.example groupe. foo-web dépend de foo.

Pour pouvoir développer la partie UI de l'application sans dépendre de services externes, des DAO factices ont été implémentés dans foo (ils retournent des données statiques donc nous n'avons pas à nous connecter à des bases de données, etc.).

Nous devions déplacer les classes factices vers src/test/Java. Cela signifie qu'ils ne sont pas déployés avec foo.jar à la guerre construite à partir du projet web. J'ai trouvé ces instructions sur le site maven, mais elles ne semblent pas fonctionner pour moi.

Dans foo's pom.xml J'ai:

        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <executions>
            <execution>
              <id>test-jar</id>
              <phase>test-compile</phase>
              <goals>
                <goal>test-jar</goal>
              </goals>
            </execution>
          </executions>
        </plugin>

Lors de l'exécution mvn install sur foo-web, dans la cible de foo j'obtiendrais deux pots: foo-1.0.0-SNAPSHOT.jar et foo-1.0.0-SNAPSHOT-tests.jar. Ils sont tous les deux installés correctement dans le référentiel maven local.

Avant le foo-web la dépendance ressemblait à ceci:

<dependency>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
</dependency>

Et cela déclencherait le déploiement de foo-1.0.0-SNAPSHOT.jar à la guerre. Maintenant, je veux également déployer le -tests pot, de préférence uniquement pour un profil "local".

J'ai essayé de différentes manières de le faire:

<profile>
    <id>local</id>
    <dependencies>
        <dependency>
            <groupId>com.example</groupId>
            <artifactId>foo</artifactId>
            <version>1.0.0-SNAPSHOT</version>
            <type>test-jar</type>
        </dependency>
    </dependencies>
</profile>

Cela provoque le déploiement du fichier source avec un nom différent: com.example-foo.jar et ne déploie pas le bocal de test. J'ai également essayé d'utiliser <classifier> au lieu de <type> dans la dépendance, mais il fait toujours la même chose. J'ai essayé d'utiliser la dépendance ci-dessus en dehors du profil (aux côtés des autres), mais elle se comporte toujours de la même manière.

Si j'ajoute le <type> à la dépendance principale (sans ajouter l'autre dépendance) Je fais déployer le pot de test (avec le même nom que ci-dessus), mais la source, naturellement, ne se déploie pas.

La seule différence avec ce qui est écrit dans la documentation est le fait que la portée n'est pas spécifiée pour la dépendance de test. Cela fonctionne-t-il uniquement pour la portée test? Puis-je en quelque sorte déployer les classes de test différemment.

Je sais que la question est un peu compliquée, faites-moi savoir s'il y a quelque chose que je peux clarifier.

Merci!


Mise à jour:

Je l'ai essayé de plusieurs façons, mais cela ne fonctionnera toujours pas.

J'ai ajouté une autre exécution au plugin maven-jar dans le projet foo (la dépendance, pas le projet web principal) dans laquelle j'espérais forcer maven à compiler les classes de test dans le même jar que les principales et référencer le gros paquet par un classificateur différent. Je ne pouvais pas le faire fonctionner:

<execution>
  <id>local-build</id>
  <phase>package</phase>
  <goals>
    <goal>jar</goal>
  </goals>
  <configuration>
    <classifier>batman</classifier>
    <directory>${basedir}/src/test/Java</directory> <!-- tried several variations here -->
    <includes>
        <include>**</include>
    </includes>
  </configuration>
</execution>

Le jar a été généré avec le classificateur batman, mais je n'ai trouvé aucun moyen de l'incorporer aux classes de test dans l'objectif jar.

Ce faisant, j'ai réalisé que cela ne dépend pas du test-jar type/tests classifier/test relation d'étendue. Lorsque j'ai essayé de spécifier le nouveau pot que je construis en plus du principal, j'ai eu le même comportement que lorsque j'essayais d'inclure le -tests pot. J'ai vérifié le référentiel maven local et tous les fichiers jars du projet dépendant sont bien installés, donc le problème est la résolution des dépendances du projet principal.

tl; dr

Tout se résume à la question de savoir si vous pouvez inclure la même dépendance avec plusieurs classificateurs. D'après ce que j'ai vu jusqu'à présent, la réponse est non - je reçois toujours le com.example-foo jar lors de la spécification de la même dépendance plusieurs fois avec différents classificateurs.

35
Alex Ciminian

Mieux vaut configurer le fichier pom maven dans votre premier module

<project>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <build>
        <plugins>
            ...
            <plugin>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-jar-plugin</artifactId>
                <executions>
                    <execution>
                        <goals>
                            <goal>test-jar</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>

Après cela, une installation/version mvn déploiera également un artefact foo-1.0.0-SNAPSHOT-tests.jar

Configurez ensuite la dépendance du pot de test avec le classificateur (comme suggéré dans d'autres réponses)

<dependency>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <type>test-jar</type>
    <!-- uncomment if needed in test scope only
         <scope>test</scope>
    -->
</dependency>
48
raisercostin

Je vois que vous utilisez test-jar comme type et vous avez utilisé classifier au lieu de type mais probablement aussi avec test-jar ... mais avez-vous essayé ce qui suit?

<dependency>
    <groupId>com.example</groupId>
    <artifactId>foo</artifactId>
    <version>1.0.0-SNAPSHOT</version>
    <classifier>tests</classifier>
    <scope>test</scope>
</dependency>
4
Brambo

Je suis un peu en retard à la fête, mais j'espère que cela aide quelqu'un: vous pouvez inclure plusieurs types de la même dépendance. Supposons que votre projet dépend de common-artifact-1.0.jar, et il y a aussi un pot de test common-artifact-1.0-tests.jar.

Vous pouvez importer le pot et le pot de tests en procédant comme suit:

<dependencies>
    <dependency>
        <groupId>my.corp</groupId>
        <artifactId>common-artifact</artifactId>
        <version>1.0</version>
        <type>jar</type>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>my.copr</groupId>
        <artifactId>common-artifact</artifactId>
        <version>1.0</version>
        <type>test-jar</type>
        <scope>test</scope> <!-- the "compile" scope also works here -->
    </dependency>
</dependencies>
2
Jeronimo Backes

Une solution de travail que j'ai trouvée était d'utiliser le plug-in d'aide à la construction pour obtenir le dossier de test dans l'assembly que je suis bâtiment pour le profil local. C'est dans le projet dépendant:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <!-- used to package the dummy daos when building 
         with the local profile -->
    <artifactId>build-helper-maven-plugin</artifactId>
    <executions>
        <execution>
            <phase>generate-sources</phase>
            <goals>
                <goal>add-source</goal>
            </goals>
            <configuration>
                <sources>
                    <source>${extra.sources.dir}</source>
                </sources>
            </configuration>
        </execution>
    </executions>
</plugin>

Et le profil, également dans le projet dépendant:

<profile>
    <id>local</id>
    <properties>
        <env.resources.dir>src/test/resources</env.resources.dir>
        <extra.sources.dir>src/test/Java</extra.sources.dir>
    </properties>
    <dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.1</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>org.springframework.test</artifactId>
            <scope>compile</scope>
        </dependency>
    </dependencies>
</profile>

De cette façon, le pom du projet principal n'est pas modifié et les stubs sont déployés lors de la construction locale.

Je n'ai toujours pas découvert si vous pouvez déployer plusieurs classificateurs, cependant. :)

1
Alex Ciminian

Si vous avez besoin des pots au moment de l'exécution, vous pouvez également essayer l'astuce suivante. Cela copie simplement les dépendances directement dans votre dossier cible lors de la compilation. Je m'attends à ce qu'ils soient inclus lors de la création d'un package ... Je n'ai pas testé cela moi-même

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>             
      <id>copy-dependencies</id>
      <phase>compile</phase>
      <goals>
        <goal>copy-dependencies</goal>
      </goals>
      <configuration>
        <artifactSet>
          <includes>
        <include>com.example:foo</include>
          </includes>
        </artifactSet>
        <outputDirectory>target/dependencies</outputDirectory>
      </configuration>
    </execution>
  </executions>
</plugin> 
0
Brambo