Используйте плагин maven-shade, чтобы сохранить все исходные и только классы из deps

#maven-shade-plugin

Вопрос:

Я затеняю проект с большим количеством зависимостей. Мне нужно сохранить все из исходного артефакта и включить только классы из других проектов. Звучит просто, не так ли? Единственная проблема в том, что идентификаторы групп повсюду, и я, похоже, не могу получить чистую конфигурацию.

 <filter>
  <artifact>*:*</artifact>
  <includes>
    <include>**/*.class</include>
  </includes>
</filter>
<filter>
  <artifact>${project.groupId}:${project.artifactId}</artifact>
  <includes>
    <include>**</include>
  </includes>
</filter>
 

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

Я не хочу добавлять фильтр для каждого артефакта. Их слишком много, и почему я снова и снова повторяю тег зависимостей. Я также не хочу выбирать ресурсы для исключения из зависимостей, потому что я не всегда знаю, что это такое, и я не хочу вносить в них изменения здесь (хотя на данный момент я пошел по этому пути).

Набор артефактов не помогает, потому что он включает или исключает только артефакт, и DontIncludeResourceTransformer также не помогает, поскольку он действует на конечный отфильтрованный набор ресурсов.

Что может быть полезным, так это разрешить фильтрам находиться в наборе артефактов:

 <artifactSet>
  <includes>
    <include>*:*</include>
  </includes>
  <filters>
    <filter>
      <includes>
        <include>**/*.class</include>
      </includes>
    </filter>
  </filters>
</artifactSet>
<artifactSet>
  <includes>
    <include>${project.groupId}:${project.artifactId}</include>
  </includes>
</artifactSet>
 

В качестве альтернативы создайте тег «Набор фильтров», который будет разветвлять операции фильтрации и объединять ресурсы в конце:

 <filters>
  <filterSet>
    <filter>
      <artifact>*:*</artifact>
      <includes>
        <include>**/*.class</include>
      </includes>
    </filter>
  </filterSet>
  <filterSet>
    <filter>
      <artifact>${project.groupId}:${project.artifactId}</artifact>
      <includes>
        <include>**</include>
      </includes>
    </filter>
  </filterSet>
</filters>
 

Alternatively, add a boolean «branch/preserve/pin» tag in the filter:

 <filter>
  <artifact>*:*</artifact>
  <includes>
    <include>**/*.class</include>
  </includes>
</filter>
<filter>
  <artifact>${project.groupId}:${project.artifactId}</artifact>
  <preserve>true</preserve>
</filter>
 

I see also that

As of version 1.6, minimizeJar will respect classes that were
specifically marked for inclusion in a filter.

But I’d still like to refine the final set of classes to what is actually needed. So filter including **/*.class is out, since there’s no switch to configure minimizeJar behaviour.

It looks like the maven-assembly-plugin can’t help, so I’ve had to go with this and hope for the best

 <filter>
  <artifact>*:*</artifact>
  <excludes>
    <exclude>**/*.sql</exclude>
    <exclude>**/*.xsd</exclude>
    <exclude>**/*.json</exclude>
    <exclude>**/*.bat</exclude>
    <exclude>**/*.dll</exclude>
    <exclude>**/*.lib</exclude>
    <exclude>**/*.properties</exclude>
    <exclude>**/*.exclude</exclude>
    ...
  </excludes>
</filter>