使用Maven构建复杂的Flex项目

时间:2011-03-18 18:51:36

标签: eclipse flex actionscript-3 maven sonatype

1 个答案:

答案 0 :(得分:1)

我的解决方案有点复杂并且感觉“很脏” - 我认为可能会有更清洁的方式,但至少我现在已经开始运行了。

基本上,我正在使用Maven-assembly-plugin创建中间zip存档('war'确实同样有效),包含swf可执行文件以及我正在创建的每个插件的任何必要的静态资产(我们是使用类似于Eclipse工作的类似OSGi的动态加载器,其中一个静态文件是plugin.xml,其他是翻译文件,其中没有一个可以嵌入到.swf中。 Maven将.swf文件以Maven文件名表示法存储为主要工件 - 我完全无视 - 以及我的zip存档(根据finalName标记使用.swf名称)。 POM和程序集文件的工作原理如我原来的问题所示。

我添加了一个空白的装配项目,其唯一目标是依赖并因此包括我的所有其他项目。这个项目的输出是我的最终“真实”工件,我可以将其用于分发和部署。由于我不想将我的Eclipse工作区与太多帮助项目集群,因此我打破了Maven项目和Eclipse项目的1:1关系:我的Maven程序集插件只存在于master_build项目内的子目录“assembly”中。我在我的主pom(master_build / pom.xml)中为它添加了一个模块语句,它将作为最后一个项目在reactor中执行。 (由于给定的依赖性,订购是自动完成的 - 如果您将其指定为第一个模块并且最后没有执行,那么您正在构建您不需要的项目:)

我还让我的装配项目POM成为我的主POM的孩子。这不是必需的,但通过这样做,我可以继承我定义的Maven属性。它还继承了对Flex编译器的调用,但由于此处没有任何可编译的内容,因此不会造成损害。 YMMV。

这是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>full_build</artifactId>
        <version>1.0-SNAPSHOT</version>
        <relativePath>../</relativePath>
    </parent>


    <groupId>${group-id}</groupId>
    <artifactId>full_assembly</artifactId>
    <name>Final Assembly</name>
    <version>${project.parent.version}</version>
    <packaging>pom</packaging> <!-- note that this is POM here, not war or zip -->

    <build>
        <plugins>
            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>2.2.1</version>
                <configuration>
                    <descriptors>
                        <descriptor>final-assembly.xml</descriptor>
                    </descriptors>
                </configuration>
                <executions>
                    <execution>
                        <id>Final-Packaging</id>
                        <phase>package</phase>
                        <goals>
                            <goal>single</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>de.zefiro.maven.example</groupId>
            <artifactId>wrapper</artifactId>
            <version>1.0</version>
            <type>war</type>
        </dependency>
        <dependency>
            <groupId>${group-id}</groupId>
            <artifactId>project_swf</artifactId>
            <version>${project.version}</version>
            <type>zip</type>
            <classifier>WebContent</classifier> <!-- needs to be the ID of the assembler xml which packaged the zip file -->
        </dependency>
[... all other projects which should be packaged ...]
    </dependencies>
</project>

遵循汇编描述符。有关详细信息,请参阅assembly descriptor documentation

<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>FinalAssembly</id>
    <formats>
        <format>war</format> <!-- can be either zip or war, depending on what you wish -->
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <includes>
                <include>de.zefiro.maven.example:wrapper:war:*</include>
            </includes>
            <unpack>true</unpack>
        </dependencySet>
        <dependencySet>
            <includes>
                <include>${group-id}:project_swf:zip:WebContent:${project.version}</include>
            </includes>
            <useProjectAttachments>true</useProjectAttachments>
            <unpack>true</unpack>
            <outputDirectory>sample_project_1</outputDirectory>
        </dependencySet>
[... list the same projects as in the POM file ...]
    </dependencySets>
</assembly>

我有一个我正在消费的档案,来自不同的部门。它包含HTML包装器和运行的主Flex应用程序(稍后根据配置文件和单个项目plugin.xml元数据从子目录加载我的所有插件)。它位于输出存档根目录中。所有其他项目都是我自己创建的项目并放在各个子目录中,因此我不在这里使用通配符。由于我想要一个包含所有合并文件的存档,因此我使用了依赖项集的解压缩选项。

请注意,在各个swf插件项目的asembly描述符中声明的ID现在用作pom文件的依赖项部分中的分类器以及程序集描述符中Maven位置的一部分。包装类型相同,我在这里选择拉链。由于这仅用于中间档案,拉链很好,对于最终组装,可以选择不同的格式。

从同一个父继承,我可以重用我的Maven属性,这些属性也可以在程序集描述符中使用。

可以通过复制现有项目并将其添加到:

来添加新项目
  • master_build / pom.xml作为模块
  • 依赖关系部分中的master_build / assembly / pom.xml
  • master_build / assembly / final-assembly.xml作为dependencySet

最终的工件是一个war文件,其中包含:

sample_project_1/SampleProjectModule1
sample_project_1/assets/labels.xlf
sample_project_1/config/config.xml
other_data/configuration.xml
application.swf
index.html

即。我们在各自子目录中的所有swf项目的内容与包含静态文件的wrapper.war的内容合并。

可以从此位置的存储库中检索它:

de.zefiro.maven.example:full_assembly:war:FinalAssembly:1.0-SNAPSHOT

要编译每个插件的样式表,我使用相同的基本思想,向下移动到单个项目级别。我将在the other questions

中对其进行描述

打开问题:我无法同时生成文件的调试版和发行版。我可以将项目加倍并将它们打包在一起(就像我对样式表一样)或者我可以运行整个Maven反应器(对于父POM和主程序集)两次,例如不同的groupIds,从而为所有涉及的项目创建两个完全独立的路径。不过,我没有对此进行进一步调查。