Maven y eclipse: ¿una forma confiable de agregar frascos no Maven o externos a un proyecto?


[7] Maven es grande. Principalmente me mantiene fuera del infierno de dependencias jar al especificar versiones de paquetes dependientes en la configuración pom, y las aplica automáticamente. También tiene una gran integración con Eclipse a través de m2e, por lo que las cosas funcionan a la perfección en un IDE.

Todo esto es genial para las dependencias que Maven conoce globalmente. Sin embargo, a veces, hay bibliotecas que deben incluirse en un proyecto que no está disponible en los repositorios Maven. En este caso, suelo añadir a un directorio lib/ en mi proyecto. Mientras estén en el classpath entonces las cosas se compilan.

Sin embargo, el problema es conseguir que se incluyan automáticamente al importar un proyecto. He estado tolerando este problema con correcciones a medio cocinar y hacks durante demasiado tiempo. Cada vez que alguien instala este proyecto, tengo que decirle que agregue manualmente los jars en lib/ a su ruta de compilación de Eclipse para que todos los errores desaparezcan. Algo como el siguiente:

introduzca la descripción de la imagen aquí

Estoy buscando una manera de automatizar este proceso de una manera que funcione tanto con el programa de línea de comandos mvn y Eclipse: más un énfasis en Eclipse, porque es bueno tener proyectos que solo compilan cuando los importa.

No quiero configurar un servidor repo para esto, ni tengo ningún componente propietario interno que garantice la configuración de nada localmente. Solo tengo algunos archivos jar donde los desarrolladores no usan Maven; y Quiero compilar con ellos...Debería ser capaz de incluirlos en la distribución de mi software, ¿verdad?

Realmente estoy buscando una manera razonable de implementar esto que también funcione en Eclipse sin problemas. Esta es una solución que he encontrado prometedora, pero definitivamente no parece haber una solución autorizada a este problema. La única otra cosa que se acerca es el maven-addjars-plugin, que funciona bien pero solo en la línea de comandos. Este plugin no está mal, y tiene una configuración bastante razonable:

<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>

Sin embargo, intentar que se ejecute en Eclipse implica agregar el siguiente lío sobre la asignación del ciclo de vida a su pom.xml, que nunca he llegado a trabajar; ni siquiera creo que esté configurado para agregar nada a la ruta de compilación de 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>
Author: Andrew Mao, 2013-03-09

3 answers

1) puede usar la dependencia del ámbito del sistema

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

2) puede copiar su x.jar al repositorio maven local como

Repository/test/x/1.0/x-1.0.jar

Y añadir una dependencia como

    <dependency>
        <groupId>test</groupId>
        <artifactId>x</artifactId>
        <version>1.0</version>
    </dependency>
 50
Author: Evgeniy Dorofeev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-10 06:13:46

Puede usar maven para instalar archivos desde una carpeta project\lib al repositorio local con el maven-install-plugin como se muestra a continuación. He hecho esto antes con controladores JDBC. Es posible que tenga que crear un pom separado para él y ejecutarlo con mvn-f installdeps.pom o algo así.

Si puedes conseguir que juegue bien y se vincule con un ciclo de vida como validate o algo, entonces puedes usar el plugin m2e con Eclipse y podría jugar bien y leer dependencias directamente desde el pom.xml e instale los jars según sea necesario en el repositorio 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>
 5
Author: Javanator,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-09 01:24:13

Me parece que podría usar el Complemento Maven Resources para hacer esto por usted. Simplemente enlaza la copia de recursos a una fase del ciclo de vida apropiada (una fase previa a la compilación). Lo más probable es que necesite modificar el complemento maven-compiler-plugin para que estas bibliotecas estén en el classpath al compilar y en tiempo de ejecución.

 0
Author: Muel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-09 01:12:52