Лучший способ получить зависимости maven - PullRequest
3 голосов
/ 06 августа 2010

Мне нужно использовать только этот класс org.apache.commons.io.FileUtils, и все же я загружаю все классы общих ресурсов, которые мне на самом деле не нужны, есть ли способ сказать, чтобы maven загружал только класс FileUtils? Не целые общие, как от зависимости ниже

<dependency>
   <groupId>commons-io</groupId>
   <artifactId>commons-io</artifactId>
   <version>1.4</version>
</dependency>

Ответы [ 4 ]

4 голосов
/ 06 августа 2010

есть ли способ сказать maven скачать только класс FileUtils?

Нет.Но, в зависимости от вашего конкретного случая использования, вы можете использовать Maven Shade Plugin для создания uber-jar и фильтрации содержимого включенных зависимостей:

ВыборСодержимое для Uber JAR

...

Для детального управления включением классов из выбранных зависимостей можно использовать фильтры артефактов:

<project>
  ... 
  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-shade-plugin</artifactId>
        <version>1.3.3</version>
        <executions>
          <execution>
            <phase>package</phase>
            <goals>
              <goal>shade</goal>
            </goals>
            <configuration>
              <filters>
                <filter>
                  <artifact>junit:junit</artifact>
                  <includes>
                    <include>junit/framework/**</include>
                    <include>org/junit/**</include>
                  </includes>
                  <excludes>
                    <exclude>org/junit/experimental/**</exclude>
                    <exclude>org/junit/runners/**</exclude>
                  </excludes>
                </filter>
                <filter>
                  <artifact>*:*</artifact>
                  <excludes>
                    <exclude>META-INF/*.SF</exclude>
                    <exclude>META-INF/*.DSA</exclude>
                    <exclude>META-INF/*.RSA</exclude>
                  </excludes>
                </filter>
              </filters>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
  ...
</project>

Здесь Ant-подобные шаблоны используются для указания того, что из junit зависимости: junit в UAR JAR должны быть включены только определенные классы / ресурсы.Второй фильтр демонстрирует использование групповых символов для идентификации артефакта, который был представлен в плагине версии 1.3.Он исключает все связанные с сигнатурой файлы из каждого артефакта, независимо от его группы или идентификатора артефакта.

Но обратите внимание, что FileUtils зависит от других классов:

import org.apache.commons.io.filefilter.DirectoryFileFilter;
import org.apache.commons.io.filefilter.FalseFileFilter;
import org.apache.commons.io.filefilter.FileFilterUtils;
import org.apache.commons.io.filefilter.IOFileFilter;
import org.apache.commons.io.filefilter.SuffixFileFilter; // depends on org.apache.commons.io.IOCase
import org.apache.commons.io.filefilter.TrueFileFilter;
import org.apache.commons.io.output.NullOutputStream;

Что вы, очевидно,нужно включить тоже.

1 голос
/ 06 августа 2010

Apache commons io не имеет зависимостей от других проектов apache commons. Вы получаете только общие io, никаких других общих библиотек. Это одна банка примерно с 100 классами, не очень много.

Вы не можете включить в свой проект только один класс - это также может привести к нарушению лицензии!

Взгляд на источник FileUtils также показывает большой импорт других общих классов. Это не будет работать без остальной части банки!

1 голос
/ 06 августа 2010

Используйте элемент зависимости <exclusion>

    <dependency>
      <groupId>sample.ProjectA</groupId>
      <artifactId>Project-A</artifactId>
      <version>1.0</version>
      <scope>compile</scope>
      <exclusions>
        <exclusion>  <!-- declare the exclusion here -->
          <groupId>sample.ProjectB</groupId>
          <artifactId>Project-B</artifactId>
        </exclusion>
      </exclusions> 
    </dependency>

, чтобы исключить те переходные зависимости, которые вам не нужны.

Также рекомендуется использовать mvn dependency:analyze-only и mvn dependecy:tree чтобы понять, как на самом деле строится ваш график зависимостей и какие зависимости вы действительно используете, а не декларируете и / или декларируете и не используете.

С уважением.

0 голосов
/ 06 августа 2010

Я так не думаю.Артефакты упакованы в файлы jar;вы не можете получить их по отдельности (то есть, по отдельности).По крайней мере, насколько мне известно.

Кроме того, подумайте об этом немного больше - вполне возможно, что класс FileUtils зависит от других классов.Но вы не можете сказать, что это такое, не изучив источник.Это информация, которую пользователь пакета не должен знать.Вы не хотели бы выяснять любой другой класс, который FileUtils использует (или какие другие классы используют зависимости FileUtils и так далее и так далее).Вот почему весь артефакт распространяется как дискретная и автономная сущность.Артефакт в целом, если он будет mavenized, будет знать, какие зависимости ему нужны , и maven также захватит их для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...