2014-01-20 3 views
1

У меня есть группа проектов, которые имеют (а) сгенерированные бобы и (б) код для работы с этими бобами. Я хотел бы, чтобы каждый такой проект создавал два разных артефакта: обычный артефакт jar, содержащий все классы, и настраиваемый артефакт beans, содержащий только сгенерированные типы.Пользовательский второй упаковочный артефакт из одного pom.xml, как jar и test-jar?

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

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

<project> 
    <groupId>${groupId}</groupId> 
    <artifactId>${artifactId}</artifactId> 
    <version>${version}</version> 

    <build> 
    <plugins> 
     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <executions> 
      <execution> 
      <goals> 
       <goal>test-jar</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

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

<dependency> 
    <groupId>${groupId}</groupId> 
    <artifactId>${artifactId}</artifactId> 
    <version>${version}</version> 
    <!-- <type>jar</type> --> 
</dependency> 

<dependency> 
    <groupId>${groupId}</groupId> 
    <artifactId>${artifactId}</artifactId> 
    <version>${version}</version> 
    <type>test-jar</type> 
</dependency> 

Я хотел бы создать плагин, который позволит мне использовать (например) beans вместо test-jar создать подобный «спаренный» артефакт.

Я ткнул в исходный код maven, и вы может создавать нестандартные типы. Тем не менее, «test-jar» кажется «испеченным» в maven, поэтому я не могу сказать, есть ли у него какие-то специальные функции, и я не могу дублировать это поведение с помощью своего собственного плагина.

Конечно, если есть другой способ справиться с таким поведением без пользовательских типов, которые понимает m2e - например, но получение m2e для понимания моего классификатора, хотя that seems hard - Я все уши! :)

Как я могу сделать подобный парный тип упаковки? Я видел this answer о том, как создавать пользовательские типы, но создается впечатление, что создается только один артефакт из помпы с заданным пользовательским типом упаковки.

ответ

2

OK, выяснили, как получить пользовательский тип, работающий с дополнительным артефактом из того же POM.

You do использовать прилагаемые артефакты для создания дополнительного артефакта. В моем примере, я использовал этот вызов в моей цели в моем плагине (после того, как я закончил строить свой файл JAR):

@Mojo(name="goal-name", defaultPhase=LifecyclePhase.PACKAGE) 
public class MyMojo 
    extends AbstractMojo 
{ 
    @Component 
    private MavenProject project; 

    @Component 
    private MavenProjectHelper projectHelper; 

    @Component(role=Archiver.class, hint="jar") 
    private JarArchiver archiver; 


    public void execute() throws MojoExecutionException { 
     // Do work... 

     // Create JAR file... 
     File jarFile=createJarFile(archiver); 

     projectHelper.attachArtifact(project, "beans-jar", jarFile); 
    } 
} 

Обратите внимание, что я указанное мой пользовательский тип beans-jar и не классификатора.

Затем я бросил файл компонентов в мой плагин в src/main/resources/plexus/components.xml:

<component-set> 
    <components> 
    <component> 
     <role>org.apache.maven.artifact.handler.ArtifactHandler</role> 
     <role-hint>beans-jar</role-hint> 
<implementation>org.apache.maven.artifact.handler.DefaultArtifactHandler</implementation> 
     <configuration> 
     <classifier>beans</classifier> 
     <extension>jar</extension> 
     <type>beans-jar</type> 
     <packaging>jar</packaging> 
     <language>java</language> 
     <addedToClasspath>true</addedToClasspath> 
     </configuration> 
    </component> 
    </components> 
</component-set> 

Здесь я указываю свой собственный тип beans-jar и classifier, который, как представляется, будет использоваться имя нового атрибута в хранилище.

Этот файл был основан на artifact-handlers.xml от проекта maven-core в главном хранилище maven. На данный момент этот файл located here. (Я нашел этот файл grepping для test-jar во всех .xml-файлах в репозитории maven.)

Чтобы импортировать эту зависимость, можно использовать:

<dependency> 
    <groupId>${groupId}</groupId> 
    <artifactId>${artifactId}</artifactId> 
    <type>beans-jar</type> 
</dependency> 

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

2

Я хотел бы предложить, чтобы попробовать более простой способ, как это:

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-jar-plugin</artifactId> 
    <executions> 
     <execution> 
     <id>second-jar</id> 
     <goals> 
      <goal>jar</goal> 
     </goals> 
     <configuration> 
      <classifier>second</classifier> 
      <includes> 
      <include>**/service/*</include> 
      </includes> 
     </configuration> 
     </execution> 
    </executions> 
    </plugin> 

через <include> вы можете определить, какие классы будут упакованы в дополнительный файл банку.

+1

Мне нравится это предложение! Очень просто. Но я думаю, что полученный артефакт может быть импортирован только как зависимость с использованием классификаторов, правильно? Сначала я попробовал очень похожий подход, затем обнаружил, что, хотя maven поддерживает классификаторы просто отлично, m2e этого не делает. Поиск поддержки m2e - это то, что заставило меня пойти на эту дикую охоту на гусей. Ответ, который я вам предоставил, позволяет импортировать полученный артефакт с использованием настраиваемого типа упаковки, который поддерживает как maven, так и m2e. – sigpwned