Я не нашел способа создать несколько артефактов из одного и того же POM-файла, даже запустить целевую сборку flexmojo более одного раза (даже при связывании с тегом выполнения Maven будет жаловаться). Таким образом, лучший способ, который я нашел, это использовать довольно похожее решение для моего общего проекта, который я описал в этом вопросе, включая мое решение , и которое я предлагаю прочитать, поскольку я буду опираться на это , Я надеялся на менее хакерское решение здесь, использование этого мультипроектного подхода кажется мне немного грязным. Вот почему я разделил вопрос, что, в свою очередь, дало мне честь быть замеченным самим Джеффом Этвудом:)
Я хочу использовать только один проект Eclipse для моего плагина, но мне нужно несколько папок для использования нескольких POM. Моя структура папок выглядит так:
colored_plugin/src/colored_plugin_main.as
colored_plugin/src/green.css
colored_plugin/src/...
colored_plugin/src/assets/rainbow.jpg <- will be embedded into stylesheet swf file
colored_plugin/WebContent/assets/labels.xlf
colored_plugin/WebContent/config/config.xlf
colored_plugin/POMs/assembly/pom.xml
colored_plugin/POMs/plugin/pom.xml
colored_plugin/POMs/style1/pom.xml
colored_plugin/pom.xml
master_build/pom.xml
master_build/swf-assembly.xml
master_build/css-assembly.xml
master_build/plugin-assembly.xml
master_build/assembly/pom.xml
master_build/assembly/final-asembly.xml
Я использую папку master_build в качестве центрального расположения для хранения файла swf-сборки для моих простых проектов swf, поэтому я поместил дескриптор сборки для плагинов, содержащих таблицы стилей, в том же месте.
POM, компилирующий плагин (POMs / plugin / pom.xml), очень похож на один из простых проектов swf (см. Другой вопрос):
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>de.zefiro.maven.example</groupId>
<artifactId>colored_plugin_internal</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../../</relativePath>
</parent>
<name>Colored Plugin (Plugin Executeable)</name>
<artifactId>${project.parent.artifactId}_swf</artifactId>
<packaging>swf</packaging>
<build>
<sourceDirectory>../../src</sourceDirectory>
<!-- This name needs to be exactly specified, as the runtime will load it as it's specified in the configuration xml -->
<finalName>SampleProjectModuleColored</finalName>
<plugin>
<groupId>org.sonatype.flexmojos</groupId>
<artifactId>flexmojos-maven-plugin</artifactId>
<version>3.7.1</version>
<configuration>
<sourceFile>colored_plugin_main.as</sourceFile>
</configuration>
</plugin>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>../../../master_build/swf-assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>WebContent-packaging</id>
<phase>package</phase>
<goals><goal>single</goal></goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>${group-id}</groupId>
<artifactId>project_swc</artifactId>
<version>${project.version}</version>
<scope>${zefiro.swf.scope}</scope> <!-- tell Flex Mojo that we want to compile using runtime shared libraries (rsl) -->
<type>swc</type>
</dependency>
[...]
</dependencies>
</project>
POM для таблицы стилей является почти идентичной версией: файл .css указан как источник, здесь зависимости не нужны (по крайней мере, в моем случае), но его все равно необходимо упаковать, чтобы я мог позже ссылаться (и перепаковать) его для сборки.
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>de.zefiro.maven.example</groupId>
<artifactId>colored_plugin_internal</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../../</relativePath>
</parent>
<name>Colored Plugin (Stylesheet 'Green')</name>
<artifactId>${project.parent.artifactId}_css_green</artifactId>
<packaging>swf</packaging>
<build>
<sourceDirectory>../../src</sourceDirectory>
<finalName>style_green</finalName>
<plugins>
<plugin>
<groupId>org.sonatype.flexmojos</groupId>
<artifactId>flexmojos-maven-plugin</artifactId>
<version>3.7.1</version>
<configuration>
<sourceFile>green.css</sourceFile>
</configuration>
</plugin>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<descriptors>
<descriptor>../../../master_build/css-assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>WebContent-packaging</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
Дескриптор сборки также является упрощенной версией, упаковывающей только файл swf. Я не уверен, что это необходимо, и, возможно, сборка может быть выполнена с использованием артефакта Maven по умолчанию, но мне было проще всего сделать это, как и в любом другом проекте.
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
<id>Stylesheet</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<!-- Take the stylesheet swf artifact (only, not the other stuff which is generated there) -->
<fileSet>
<directory>${project.build.directory}</directory>
<outputDirectory>/</outputDirectory>
<includes>
<include>*.swf</include>
</includes>
</fileSet>
</fileSets>
</assembly>
Проект сборки имеет этот POM:
<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>
<parent>
<groupId>de.zefiro.maven.example</groupId>
<artifactId>colored_plugin_internal</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../../</relativePath>
</parent>
<name>Colored Plugin (Assembly)</name>
<artifactId>colored_plugin</artifactId>
<packaging>pom</packaging>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<version>2.2.1</version>
<configuration>
<descriptors>
<descriptor>../../../master_build/plugin-assembly.xml</descriptor>
</descriptors>
</configuration>
<executions>
<execution>
<id>Plugin_assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>${group-id}</groupId>
<artifactId>${project.parent.artifactId}_swf</artifactId>
<version>${project.version}</version>
<type>zip</type>
<classifier>WebContent</classifier>
</dependency>
<dependency>
<groupId>${group-id}</groupId>
<artifactId>${project.parent.artifactId}_css_green</artifactId>
<version>${project.version}</version>
<type>zip</type>
<classifier>Stylesheet</classifier>
</dependency>
</dependencies>
</project>
Дескриптор сборки плагина объединяет все это. Он также находится в центре и, таким образом, написан в общем виде: он ссылается на идентификатор группы и artifactId из вызывающего POM и использует соглашение об именах, которое я представил. Окончательный проект будет построен сборкой POM, поэтому я указываю 'хороший' artifactId. POM основного проекта (см. Ниже) получает имя, полученное вручную, в то время как все остальные проекты (основное приложение и все таблицы стилей) автоматически выводятся из него и создают артефакты Maven, которые используются только для внутреннего использования. У меня более одной таблицы стилей, поэтому в моей реальной сборке POM перечислены несколько зависимостей таблицы стилей (в отличие от этого примера), тогда как мой дескриптор сборки принимает их все с использованием подстановочного знака.
<assembly
xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd">
<id>WebContent</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<!-- add the WebContent folder -->
<fileSet>
<directory>../../WebContent</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
<dependencySets>
<!-- add plugin main executable -->
<dependencySet>
<includes>
<include>${group-id}:${project.parent.artifactId}_swf:zip:WebContent:${project.version}</include>
</includes>
<useProjectAttachments>true</useProjectAttachments>
<unpack>true</unpack>
<outputDirectory>/</outputDirectory>
</dependencySet>
<!-- add stylesheets -->
<dependencySet>
<includes>
<include>${group-id}:${project.parent.artifactId}_css_*:zip:Stylesheet:${project.version}</include>
</includes>
<useProjectAttachments>true</useProjectAttachments>
<unpack>true</unpack>
<outputDirectory>/assets/styles</outputDirectory>
</dependencySet>
</dependencySets>
</assembly>
Обратите внимание, что для этого дескриптора сборки я использовал тот же идентификатор, что и для простых проектов swf (как показано в моем другом вопросе). Это облегчает указание правильного артефакта в общем модуле сборки, поскольку я могу просто использовать «WebContent» в качестве классификатора для всех моих проектов.
Наконец, основной POM для моего проекта - это просто небольшая программа для других POM:
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>de.zefiro.maven.example</groupId>
<artifactId>full_build</artifactId>
<version>1.0-SNAPSHOT</version>
<relativePath>../master_build</relativePath>
</parent>
<name>Colored Plugin</name>
<artifactId>colored_plugin_internal</artifactId>
<packaging>pom</packaging>
<modules>
<module>pom/plugin</module>
<module>pom/style1</module>
<module>pom/assembly</module>
</modules>
</project>
Новая таблица стилей может быть добавлена:
- добавление таблицы стилей red.css и всех сопутствующих файлов в каталог src /
- Дублирование файла color_plugin / POMs / style1 / pom.xml в файл Colored_plugin / POMs / style2 / pom.xml
- добавив его в color_plugin / pom.xm в качестве модуля
- добавление его в color_plugin / POMs / assembly / pom.xm в качестве зависимости
- из-за соглашения о подстановочных знаках и именах дескриптор сборки (/master_build/plugin-assembly.xml) не нуждается в изменении
Последний артефакт проекта - это zip-файл, который будет использован (и объединен с другими проектами) моей мастер-сборкой и содержит следующие файлы:
SampleProjectModuleColored.swf
assets/labels.xlf
assets/styles/style_green.swf
config/config.xlf
Он будет храниться в хранилище как
de.zefiro.maven.example:colored_plugin:zip:WebContent:1.0-SNAPSHOT