Для каких областей зависимостей Maven эта зависимость включена в скомпилированный проект?

2

Например, если я ставлю BukkitApi jar зависимостью для проекта maven с областью depenecy, установленной для предоставления, компиляции, системы, времени выполнения или теста

В каких областях будет включен bukkitAPI в скомпилированный вывод?

  • 1
    какой скомпилированный вывод? О какой фазе вы говорите? Например, если вы задали область действия для проверки и ничего больше, скомпилированный вывод теста, очевидно, будет использовать зависимость. Что не означает, что оно будет «включено» во что-либо, если вы явно не включаете зависимости в какой-либо вывод (например, вывод фазы package )
  • 0
    Честно говоря, я не знаю, на каком этапе, я совершенно новичок в maven, и кто-то на IRC-канале сбил меня с толку, и я подозревал, что они были не правы, я погуглил безрезультатно, поэтому попросил stackoverflow.
Теги:
maven
dependencies
m2e

2 ответа

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

Краткая версия: по умолчанию вывод maven (в target каталоге по умолчанию) не содержит ничего, кроме скомпилированного кода для текущего проекта/модуля. То есть ничего из зависимостей.

Длинная (эр) версия: с упаковкой jar умолчанию и без настраиваемой конфигурации фаз. вот как работает maven в проекте java:

  1. фаза compile: .java файлы в каталоге src/main/java/ скомпилируются в файлы .classes в target каталоге. Зависимости для области compile загружаются в локальный репозиторий.
  2. фаза package: то же, что и 1, плюс вы получите файл jar в target каталоге
  3. фаза install: то же самое, что и 2, вы получите файл jar в своем локальном репозитории.

Итак, файлы .jar из зависимостей ни в чем не включены по умолчанию!

Итак, как мне включить зависимости в мой "вывод", и что означает тезисы?

Теперь, используя, например, плагин assembly для включения зависимостей в выходе фазы package (см. Раздел "Включение зависимостей в банку с Maven"), вы обычно получите это поведение по умолчанию:

  • provided: не включено
  • compile (по умолчанию): включена
  • system: не включена
  • runtime: включено
  • test: не входит

Оформить эту ссылку для справки.

EDIT: просто попробуйте этот pom с различными значениями области на guice, и вы увидите, что зависимости включены в fake-1.0-SNAPSHOT-jar-with-dependencies.jar когда область compile и runtime (в этом примере нет нужны любые исходные файлы)

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                      http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.linagora</groupId>
    <artifactId>fake</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>fake</name>
    <dependencies>
        <dependency>
            <groupId>com.google.inject</groupId>
            <artifactId>guice</artifactId>
            <version>2.0</version>
            <scope>compile</scope>
            <!-- system scope needs 'systemPath' attribute as well
                <systemPath>/path/to/guice/guice-3.0.jar</systemPath>
                <scope>system</scope>
            -->
            <!-- <scope>runtime</scope> -->
            <!-- <scope>test</scope> -->
            <!-- <scope>provided</scope> -->

        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
  • 0
    люди утверждают, что компиляция НЕ включает зависимости в собранный вывод, приводя в качестве примера [worldguard] { github.com/sk89q/worldguard/blob/master/src/main/assembly/… } его [pom] { github .com / sk89q / worldguard / blob / master / pom.xml } что-то делает не по умолчанию?
  • 0
    Вы можете увидеть, что «по умолчанию» с pom.file выше. Просто разархивируйте fake-1.0-SNAPSHOT-jar-with-dependencies.jar с областью компиляции и убедитесь, что файлы guice включены.
Показать ещё 1 комментарий
3

Это не то, как работает Мейвен. Зависимости просто определяют путь к классам (для компиляции, времени выполнения, тестирования). Но зависимости не включаются в вывод по умолчанию. Вам придется отправлять все банки с зависимостями (по крайней мере, с компиляцией и временем выполнения).

Посмотрите на плагин зависимостей. Он предоставляет цели для копирования зависимостей.

Чтобы создать пакет для отправки, посмотрите на сборку плагина (например, для создания zip файла). Это даже дает возможность создать банку "все-в-одном", если это то, что вам нужно.

Ещё вопросы

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