Maven и Eclipse: надежный способ добавить не-Maven или внешние банки в проект?

23

Мейвен велик. В основном это избавляет меня от адской зависимости jar, указывая версии зависимых пакетов в конфигурации pom и применяет их автоматически. Он также имеет большую интеграцию с Eclipse через m2e, так что все работает без проблем в среде IDE.

Все это отлично подходит для зависимостей, которые во всем мире известны Maven. Однако иногда есть библиотеки, которые необходимо включить в проект, который недоступен в репозиториях Maven. В этом случае я обычно добавляю их в каталог lib/ в моем проекте. Пока они находятся в пути к классам, тогда компилируются вещи.

Однако проблема заключается в том, что они автоматически включаются при импорте проекта. Я слишком долго терпел эту проблему с искушенными исправлениями и хаками слишком долго. Каждый раз, когда кто-то устанавливает этот проект, я должен сказать им вручную добавить банки в lib/ к их пути сборки Eclipse, чтобы все ошибки исчезли. Что-то вроде следующего:

Изображение 25597

Я ищу способ автоматизации этого процесса таким образом, который работает как с программой командной строки mvn, так и с Eclipse: больше внимания уделяется Eclipse, потому что хорошо иметь проекты, которые просто компилируются при импорте.

Я не хочу настраивать сервер репо для этого, и у меня нет каких-либо собственных компонентов, которые гарантировали бы локальную настройку. У меня просто есть файлы jar, где разработчики не используют Maven; и я хочу с ними скомпилировать... Я должен просто включить их в дистрибутив моего программного обеспечения, верно?

Я действительно ищу разумный способ реализовать это, что также будет работать в Eclipse без суеты. Это одно из решений. Я нашел многообещающий, но там определенно не кажется авторитетным решением этой проблемы. Единственное, что подходит, это maven-addjars-plugin, который работает нормально, но только в командной строке. Этот плагин неплох и имеет довольно разумную конфигурацию:

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

Однако попытка заставить его запускать в Eclipse включает добавление следующего беспорядка в сопоставление жизненного цикла вашего pom.xml, который я никогда не получал, чтобы работать; Я даже не думаю, что он настроен на то, чтобы фактически добавить что-либо в путь сборки Eclipse.

<pluginManagement>
    <plugins>
        <!--This plugin 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>
  • 1
    Я бы предпочел полагаться на локальную установку Nexus.
  • 1
    Я хочу быть в состоянии передать это программное обеспечение другим пользователям, так что это кажется неразумным. Это всего лишь несколько банок, которыми я хочу поделиться, поэтому не должно быть так сложно.
Показать ещё 3 комментария
Теги:
maven
m2eclipse
m2e

3 ответа

47
Лучший ответ

1) вы можете использовать зависающую область системы

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

2) вы можете скопировать x.jar в локальный репозиторий maven как

репозиторий/тест/х/1,0/х-1.0.jar

и добавьте зависимость как

    <dependency>
        <groupId>test</groupId>
        <artifactId>x</artifactId>
        <version>1.0</version>
    </dependency>
  • 1
    Это именно то, что мне нужно. Это также делает банки доступными для проектов, зависящих от этого. Прекрасно интегрируется с Eclipse и избегает всего этого управляющего репо и XML, которые предлагают все остальные. Также не включает копирование дерьма в репозитории Maven. +100 голосов, если бы я мог.
  • 1
    @Andrew Андрей Мао Хорошо, если это решение работает на вас. Остерегайтесь того факта, что зависимости области действия системы похожи на «предоставляемые» зависимости . Таким образом, ожидается, что они существуют на целевой платформе и не будут включены в упакованный артефакт (например, файл войны).
Показать ещё 5 комментариев
5

Вы можете использовать maven для установки файлов из папки project\lib в локальное репо с помощью maven-install-plugin, как показано ниже. Я сделал это раньше с драйверами JDBC. Возможно, вам придется создать отдельный pom для него и выполнить его с помощью mvn -f installdeps.pom или что-то в этом роде.

Если вы можете заставить его играть красиво и привязаться к жизненному циклу, например, проверять или что-то еще, то вы можете использовать плагин m2e с Eclipse, и он просто может играть хорошие и читать зависимости прямо из pom.xml и устанавливать банки как необходимо для локального репо.

    <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>
  • 0
    Почему дети не могут установить банки non maven? Пожалуйста, объясни.
0

Мне кажется, что вы можете использовать Maven Resource Plugin, чтобы сделать это за вас. Просто привяжите копирование ресурсов к соответствующей фазе жизненного цикла (фаза до компиляции). Скорее всего, вам нужно будет настроить плагин maven-compiler, чтобы эти библиотеки находились в пути к классам при компиляции и во время выполнения.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню