web-dev-qa-db-fra.com

Maven et Eclipse: un moyen fiable d'ajouter des jars non Maven ou externes à un projet?

Maven est super. Il me garde principalement hors de l'enfer de la dépendance jar en spécifiant les versions des packages dépendants dans la configuration pom, et les applique automatiquement. Il a également une excellente intégration avec Eclipse via m2e, afin que les choses fonctionnent de manière transparente dans un IDE.

Tout cela est idéal pour les dépendances mondialement connues de Maven. Cependant, parfois, il existe des bibliothèques qui doivent être incluses dans un projet qui n'est pas disponible dans les dépôts Maven. Dans ce cas, je les ajoute généralement à un lib/ répertoire dans mon projet. Tant qu'ils sont dans le chemin de classe, les choses se compilent.

Cependant, le problème consiste à les inclure automatiquement lors de l'importation d'un projet. Je tolère ce problème avec des correctifs et des piratages à moitié cuits depuis trop longtemps. Chaque fois que quelqu'un installe ce projet, je dois lui dire d'ajouter manuellement les pots dans lib/ à leur chemin de génération Eclipse afin que toutes les erreurs disparaissent. Quelque chose comme ceci:

enter image description here

Je cherche un moyen d'automatiser ce processus d'une manière qui fonctionne à la fois avec le programme de ligne de commande mvn et Eclipse: plus d'accent sur Eclipse, car il est agréable d'avoir des projets qui se compilent simplement lorsque vous les importez .

Je ne veux pas configurer de serveur de dépôt pour cela, ni aucun composant propriétaire interne qui justifierait de configurer quoi que ce soit localement. J'ai juste quelques fichiers jar où les développeurs n'utilisent pas Maven; et je veux compiler avec eux ... Je devrais juste pouvoir les inclure dans la distribution de mon logiciel, non?

Je suis vraiment à la recherche d'un moyen raisonnable d'implémenter cela qui fonctionnera également dans Eclipse sans problème. Ceci est une solution J'ai trouvé prometteur, mais il ne semble certainement pas y avoir de solution faisant autorité à ce problème. La seule autre chose qui se rapproche est le maven-addjars-plugin , qui fonctionne bien mais uniquement sur la ligne de commande. Ce plugin n'est pas mauvais et a une configuration assez raisonnable:

<plugin>
    <groupId>com.googlecode.addjars-maven-plugin</groupId>
    <artifactId>addjars-maven-plugin</artifactId>
    <version>1.0.5</version>
    <executions>
        <execution>
            <goals>
                <goal>add-jars</goal>
            </goals>
            <configuration>
                <resources>
                    <resource>
                        <directory>${project.basedir}/lib/Java-aws-mturk</directory>
                    </resource>
                    <resource>
                        <directory>${project.basedir}/lib/not-in-maven</directory>
                    </resource>
                </resources>
            </configuration>
        </execution>
    </executions>
</plugin>

Cependant, essayer de le faire fonctionner dans Eclipse implique d'ajouter le désordre suivant sur le mappage du cycle de vie à votre pom.xml, que je n'ai jamais mis au travail; Je ne pense même pas qu'il soit configuré pour réellement ajouter quoi que ce soit au chemin de génération 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>
                                    com.googlecode.addjars-maven-plugin
                                </groupId>
                                <artifactId>
                                    addjars-maven-plugin
                                </artifactId>
                                <versionRange>
                                    [1.0.5,)
                                </versionRange>
                                <goals>
                                    <goal>add-jars</goal>
                                </goals>
                            </pluginExecutionFilter>
                            <action>
                                <execute />
                            </action>
                        </pluginExecution>
                    </pluginExecutions>
                </lifecycleMappingMetadata>
            </configuration>
        </plugin>
    </plugins>
</pluginManagement>
30
Andrew Mao

1) vous pouvez utiliser la dépendance de l'étendue du système

    <dependency>
        <groupId>test</groupId>
        <artifactId>x</artifactId>
        <version>1.0</version>
        <scope>system</scope>
        <systemPath>${basedir}/lib/x.jar</systemPath>
    </dependency>

2) vous pouvez copier votre x.jar dans le référentiel maven local en tant que

référentiel/test/x/1.0/x-1.0.jar

et ajouter une dépendance comme

    <dependency>
        <groupId>test</groupId>
        <artifactId>x</artifactId>
        <version>1.0</version>
    </dependency>
61
Evgeniy Dorofeev

Vous pouvez utiliser maven pour installer des fichiers depuis un dossier project\lib vers le référentiel local avec le plug-in maven-install comme ci-dessous. Je l'ai déjà fait avec des pilotes JDBC. Vous devrez peut-être créer un pom distinct pour celui-ci et l'exécuter avec mvn -f installdeps.pom ou quelque chose comme ça.

Si vous pouvez le faire jouer à Nice et le lier avec un cycle de vie comme valider ou quelque chose, alors vous pouvez utiliser le plugin m2e avec Eclipse et il pourrait bien jouer à Nice et lire les dépendances directement à partir du pom.xml et installer les pots selon les besoins du dépôt local.

    <plugin>
        <!-- We dont want children attempting to install these jars to the repo. -->
        <inherited>false</inherited>
        <groupId>org.Apache.maven.plugins</groupId>
        <artifactId>maven-install-plugin</artifactId>
        <executions>
            <execution>
                <id>Microsoft JDBC Driver File 1</id>
                <phase>install</phase>
                <goals>
                    <goal>install-file</goal>
                </goals>
                <configuration>
                    <file>lib/sqljdbc4.jar</file>
                    <groupId>com.Microsoft</groupId>
                    <artifactId>Microsoft-jdbc-driver</artifactId>
                    <version>4.0</version>
                    <packaging>jar</packaging>
                </configuration>
            </execution>
            <execution>
                <id>ojdbc5</id>
                <phase>install</phase>
                <goals>
                    <goal>install-file</goal>
                </goals>
                <configuration>
                    <file>lib/ojdbc5.jar</file>
                    <groupId>com.Oracle</groupId>
                    <artifactId>ojdbc5</artifactId>
                    <version>11.1.2</version>
                    <packaging>jar</packaging>
                </configuration>
            </execution>
        </executions>
    </plugin>
6
Javanator

Il me semble que vous pourriez utiliser le Maven Resources Plugin pour le faire pour vous. Liez simplement la copie des ressources à une phase de cycle de vie appropriée (une phase avant la compilation). Vous aurez très probablement besoin de modifier le plugin maven-compiler-plugin afin que ces bibliothèques soient sur le chemin de classe lors de la compilation et à l'exécution.

0
Muel