使用Maven构建包含样式表的Flex项目

时间:2011-03-18 18:57:06

标签: eclipse flex actionscript-3 maven stylesheet

Flex样式表由编译器解析,并与其资产(通常是图形)捆绑在一个swf文件中,然后可以在运行时加载。我有一个具有固定数量风格的项目(目前4:旧的企业风格,新的企业风格和两者的高对比度版本)。使用Flash Builder(带有Flex IDE插件的Eclipse)我可以将所有.css文件编译为.swf文件以及主项目工件.swf文件。使用ant脚本也可以这样做。

我目前的理解是,Maven只想为每个项目创建一个工件(POM文件),但可能会添加一些额外的工件(如zip包装)。出于可伸缩性的原因 - 我有许多库和模块项目的复杂设置,其中几个有自己的样式表 - 将项目拆分为'main'项目并为每个样式表复制是非常不切实际的。至少在Eclipse项目方面,每个都有一些POM文件的子文件夹,都是由一个主pom文件引用并引用相同的src /位置(并且在一个Eclipse项目中)可能会起作用。虽然这很丑陋,但每个人都需要单独的artifactIds,但仍然需要以某种方式进行组装。

重要的是能够拥有一个包含(Eclipse)项目主swf文件和每个样式表swf文件的最终程序集(以及一些静态文件,如在运行时加载的本地化文本)。这将是我所描述的几个项目的大型集合的一部分in a separate question

我正在使用Eclipse 3.6.1(Helios)和Flash Builder插件(即Flex4),目标是Flex SDK 3.5(FlashPlayer 10.0)。我使用Sonatypes flexmojos-maven-plugin 3.7.1安装了Maven 3.0.2(因为它看起来比Servebox更活跃)。我已经为我的项目手动创建了pom文件并且它们可以工作(虽然只编译一个swf工件文件,具体取决于我是将主.as或其中一个.css文件指定为sourceFile)

我已经尝试了几天了解“The Maven Way”(这似乎是针对Java量身定制的,而不是完全适合Flex),但是无法让它工作,所以我有一个项目,或至少一个包含所有内容的集合。

这里最好的方法是什么?

1 个答案:

答案 0 :(得分:1)

我没有找到从同一个POM文件创建多个工件的方法,甚至没有多次运行flexmojo编译目标(即使绑定执行标记,Maven也会抱怨)。因此,我发现的最佳方式是使用与我的整体项目非常相似的解决方案,我已经描述了in this question, including my solution,我建议阅读,因为我将基于此。我曾希望在这里采用一种不那么强硬的解决方案,使用这种多项目方法对我来说似乎有点肮脏。这也是我分开这个问题的原因,这反过来让我有幸被杰夫阿特伍德自己注意到了:))

我确实只想为我的插件使用一个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-assembly文件的中心位置,因此我将包含样式表的插件的汇编描述符放在同一位置。

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>

插件程序集描述符将所有这些打包在一起。它也位于一个中心位置,因此以通用方式编写:它从调用POM引用group-id和artifactId,并使用我引入的名称约定。最终的项目将由程序集POM构建,因此我指定了'nice'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项目的汇编描述符相同的ID(如我的其他问题所示)。这样可以更容易地在整个程序集插件中指定正确的工件,因为我可以使用“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 /目录
  • 将colored_plugin / POMs / style1 / pom.xml复制到colored_plugin / POMs / style2 / pom.xml
  • 将其添加到colored_plugin / pom.xm作为模块
  • 将其添加到colored_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