web-dev-qa-db-fra.com

Maven ajoute des bocaux via systemPath/system mais pas dans war ou ailleurs

Je souhaite ajouter un fichier jar via le chemin systemPath à partir du système de fichiers local par rapport à la structure de répertoire de mon projet, et non sur un référentiel distant. J'ai ajouté la déclaration de dépendance mais maven ne fait rien d'autre avec.

Dans la déclaration ci-dessous, je souhaite que le fichier jar soit copié dans mon répertoire web-inf/lib cible et également inséré dans le fichier war. À l'heure actuelle, cela n'arrive pas. Comment pourrais-je copier le fichier jar dans mon fichier de guerre?

Voici le résultat du mode débogage maven:

DEBUG] cglib:cglib-nodep:jar:2.2:test (setting scope to: compile)^M
DEBUG] Retrieving parent-POM: org.objenesis:objenesis-parent:pom:1.2 for project: null:objenesis:ja
DEBUG]   org.objenesis:objenesis:jar:1.2:test (selected for test)^M
DEBUG]   org.javap.web:testRunWrapper:jar:1.0.0:system (selected for system)^M
DEBUG] Plugin dependencies for:
...


<dependency>
    <groupId>org.javap.web</groupId>
    <artifactId>testRunWrapper</artifactId>
    <version>1.0</version>
    <scope>system</scope>
    <systemPath>${basedir}/lib/testRunWrapper.jar</systemPath>
</dependency>
<plugin>
    <artifactId>maven-war-plugin</artifactId>
    <configuration>                 
        <webResources>
            <resource>
                <directory>WebContent</directory>
            </resource>
        </webResources>
    </configuration>
</plugin>
16
Berlin Brown

OK, j’ai fait ceci: Notez la structure de répertoires en bas . Avec l’approche ci-dessous, le fichier jar du chemin de projet relatif est traité comme un citoyen de première classe comme les autres jars. La liste ci-dessous corrige mon problème initial. Avec la liste pom.xml ci-dessous, le fichier jar est copié dans mon répertoire cible.

<repositories>
    <repository>
        <id>JBoss</id>
        <name>JBoss Repository</name>
        <layout>default</layout>
        <url>http://repository.jboss.org/maven2</url>
    </repository>

    <repository>
       <id>my-local-repo</id>
       <url>file://${basedir}/lib/repo</url>
    </repository>
</repositories>

<dependency>
    <groupId>testRunWrapper</groupId>
    <artifactId>testRunWrapper</artifactId>
    <version>1.0.0</version>            
</dependency>

$ find repo
repo
repo/testRunWrapper
repo/testRunWrapper/testRunWrapper
repo/testRunWrapper/testRunWrapper/1.0.0
repo/testRunWrapper/testRunWrapper/1.0.0/testRunWrapper-1.0.0.jar
23
Berlin Brown

Utiliser le plugin maven dependency fait le travail:

<build>
    <plugins>
        <plugin>
            <groupId>org.Apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>2.8</version>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>compile</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${project.build.directory}/${project.build.finalName}/WEB-INF/lib</outputDirectory>
                        <includeScope>system</includeScope>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
16
Akram Ben Aissi

Ne pas utiliser le système. Pour faire ce que vous voulez, déclarez-le comme une dépendance normale (à la compilation) et utilisez mvn install: install-file dans votre référentiel local. Tout le reste fonctionnera comme vous le souhaitez (les bibliothèques seront copiées, etc.). Cela signifie que la construction ne fonctionnera que sur votre ordinateur.

Pour résoudre correctement ce problème pour votre équipe (interne), vous souhaitez configurer un référentiel (par exemple, Artifactory, Nexus ou Archiva). Ceci est presque indispensable pour une utilisation en équipe de Maven. 

Si cela est destiné à un usage public (par exemple, open source), vous pouvez imiter un référentiel via un serveur http ou créer un référentiel réel.

5
Will Iverson

essayez quelque chose comme ceci (en utilisant le plugin Ant pour mettre manuellement le jar dans le répertoire de sortie):

<plugin>
       <artifactId>maven-antrun-plugin</artifactId>
       <executions>
         <execution>
           <phase>test</phase>
           <goals>
             <goal>run</goal>
           </goals>
           <configuration>
             <tasks>
               <copy file="${project.basedir}/pathToJAR.jar"
                     todir="${project.build.directory}/outputFileName/WEB-INF/lib"/>
             </tasks>
           </configuration>
         </execution>
       </executions>
     </plugin>
2
Abed

D'après les informations dont je dispose, les dépendances étendues au système ressemblent un peu à celles avec la portée fournie et ne sont donc pas incluses dans l'artefact cible. Pourquoi n'installez-vous pas la dépendance dans votre référentiel local à la place?

De la doc:

système
Cette étendue est similaire à fournie sauf que vous devez fournir le fichier JAR qui le contient explicitement. L'artefact est toujours disponible et n'est pas recherché dans un référentiel.

1
Thomas

Au cas où cette réponse ne fonctionnait pas pour vous comme cela ne m’était pas fait pour vous et que vous savez que system est une mauvaise portée, vous pouvez essayer cette solution à votre place Installation du fichier jar à l’aide de install-plugin (faites défiler un peu) qui installe le fichier JAR dans votre référentiel Maven local. En gros, il vous suffit d’ajouter ce plugin à votre pom.xml:

<plugin>
  <groupId>org.Apache.maven.plugins</groupId>
  <artifactId>maven-install-plugin</artifactId>
  <version>2.4</version>
  <executions>
    <execution>
      <phase>initialize</phase>
      <goals>
        <goal>install-file</goal>
      </goals>
      <configuration>
        <groupId>myGroupId</groupId>
        <artifactId>myArtifactId</artifactId>
        <version>myVersion</version>
        <packaging>jar</packaging>
        <file>${basedir}/lib/xxx.jar</file>
      </configuration>
    </execution>
  </executions>
</plugin>

Entrez les valeurs appropriées pour groupId, artifactId et version et placez votre fichier JAR d'origine dans le répertoire <project-home>/lib- et corrigez file ci-dessus. Vous pouvez ajouter plus de sections execution-, mais n'oubliez pas d'ajouter ids, comme:

      <execution>
        <id>common-lib</id>

Tous ceux qui mettent à jour depuis le dépôt de code doivent appeler mvn initialize une fois.

Et tous les passionnés d’Eclipse peuvent ajouter ceci à pom.xml, également, pour supprimer les erreurs dans Eclipse:

<pluginManagement>
  <plugins>
    <!-- This plugin's configuration is used to store Eclipse m2e settings 
      only. It has no influence on the Maven build itself. -->
    <plugin>
      <groupId>org.Eclipse.m2e</groupId>
      <artifactId>lifecycle-mapping</artifactId>
      <version>1.0.0</version>
      <configuration>
        <lifecycleMappingMetadata>
          <pluginExecutions>
            <pluginExecution>
              <pluginExecutionFilter>
                <groupId>org.Apache.maven.plugins</groupId>
                <artifactId>maven-install-plugin</artifactId>
                <versionRange>[2.4,)</versionRange>
                <goals>
                  <goal>install-file</goal>
                </goals>
              </pluginExecutionFilter>
              <action>
                <execute></execute>
              </action>
            </pluginExecution>
          </pluginExecutions>
        </lifecycleMappingMetadata>
      </configuration>
    </plugin>
  </plugins>
</pluginManagement>
0
sjngm

Le problème lié à l'utilisation d'une référence au système de fichiers est que les projets dépendants ne pourront pas accéder globalement à ce fichier jar. c'est-à-dire que le projet $ {basedir} dépendant est différent et que le fichier .jar ne sera pas trouvé.

Les référentiels globaux sont quant à eux universellement accessibles.

0
paiego