我目前正在考虑用 Maven 替换我们专有的构建环境。当前的解决方案是中央构建的内部开发,为了更轻松的本地开发,我在 Eclipse/Flex IDE 内进行编译,并使用 ANT 脚本将所有内容一起复制到我的本地 Apache 目录(即我的 ant 文件不执行完整构建)并且还依赖于所有项目都在本地可用)。
我们使用 Eclipse 3.6.1 (Helios) 和 Flash Builder 插件(即 Flex4),目标是 Flex SDK 3.5 (FlashPlayer 10.0),其中有相当多的项目,包括要在运行时加载的 .swc 库项目和 .swf 模块,包括每个项目的资源。我们还使用外部链接/运行时共享库(一个大的sharedlibraries.swf包含所有内容,即部署中不需要.swc文件)。我已经使用 Sonatypes 安装了 Maven 3.0.2flexmojos-maven-插件 3.7.1 https://repository.sonatype.org/content/sites/maven-sites/flexmojos/3.8/plugin-info.html(因为它看起来比 Servebox 的更活跃)。我已经为每个 Eclipse 项目手动创建了 pom 文件,以确保一切正常,而且 Eclipse-Maven 集成似乎缺乏 Flex 支持。我已经定义了适当的编译器和依赖项参数,以便所有单独的项目都能正确编译 - 即生成的 .swf 文件确实会生成我们应用程序的工作版本。我也读过《Maven 示例 http://www.sonatype.com/books/mvnex-book/reference/public-book.html“来自 Sonatype 的书并查看了他们的”Maven:完整参考 http://www.sonatype.com/books/mvnref-book/reference/public-book.html”,同时并行进行大量谷歌搜索。
我正在努力解决的是我的项目的最终组装,以及其他工件(样式表)。我并不完全理解“Maven 方式”,并且还怀疑 Maven 是专门为 Java 量身定制的,因此让我对 Flex 项目感到有些茫然。
我的项目的基本结构:
- 外部库:我已将那些带有 install:install-file 的库添加到我的存储库中,这里没有问题
- 自己的库项目:它们每个都会生成一个 .swc 工件,可以在其他项目中使用,并且 Maven 依赖项处理工作正常,这里没有问题
- 自己的 swf 模块项目:我们的应用程序在运行时加载 swf 文件,而这些文件又需要一些额外的资源(stylesheet.swf 文件、本地化字符串作为单独的 .xlf 文件、配置文件等)。正是那些我正在挣扎的人。
我的 swf 项目的布局:
-
bin-调试/由 IDE 构建使用,由 Maven 构建不使用/忽略
-
src/Flex 源(.as 和 .mxml 文件)
-
target/Maven 目标目录
-
网页内容/包含补充文件的目录,需要将其与 .swf 工件一起逐字复制到目标工件(目录或 zip 文件)
-
styles/Flex .css 文件需要编译成 .swf 样式表文件,这些文件是主项目 swf 和 WebContent/ 内容的附加工件(每个 .css 一个,用于不同的主题)
我使用平面层次结构在 Eclipse 中工作,即我的主 pom 文件放置在与所有项目文件夹同级的文件夹中。例子:
project_swf/src/...
project_swf/WebContent/assets/labels.xlf
project_swf/WebContent/config/config.xml
project_swf/pom.xml
lib_swc/src/...
lib_swc/pom.xml
master_build/pom.xml
master_build/swf-assembly.xml
我已经成功创建了一个“主构建”,使用它来构建我的所有 SWC 和 SWF 项目大师 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>
<name>Dragon Master Build</name>
<description>This project can be used to build and package the client application</description>
<properties>
<!-- this needs to be the same as the groupId tag, which unfortunately cannot be accessed directly using ${} notation -->
<group-id>de.zefiro.maven.example</group-id>
<!-- parameter to plugin swf files, shown as plugin 'Build Number' in client -->
<!-- TODO should be a build number on central system -->
<zefiro.plugin.buildno>local_dev_mvn</zefiro.plugin.buildno>
<!-- build all SWF files (except sharedlibraries.swf) with external references (Note: Flexmojo abuses the 'scope' concept here, but there is currently no better way) -->
<zefiro.swf.scope>external</zefiro.swf.scope>
</properties>
<groupId>de.zefiro.maven.example</groupId>
<artifactId>full_build</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>pom</packaging>
<build>
<sourceDirectory>src/</sourceDirectory>
<plugins>
<plugin>
<groupId>org.sonatype.flexmojos</groupId>
<artifactId>flexmojos-maven-plugin</artifactId>
<version>3.7.1</version>
<extensions>true</extensions>
<!-- We need to compile with Flex SDK 3.5 -->
<dependencies><dependency>
<groupId>com.adobe.flex</groupId>
<artifactId>compiler</artifactId>
<version>3.5.0.12683</version>
<type>pom</type>
</dependency></dependencies>
<!-- configuration for the Flex compilation -->
<configuration>
<targetPlayer>10.0.0</targetPlayer>
<incremental>false</incremental>
<debug>false</debug>
<runtimeLocales></runtimeLocales>
<locale>en_US</locale>
<optimize>true</optimize>
<showWarnings>true</showWarnings>
<strict>true</strict>
<useNetwork>true</useNetwork>
<allowSourcePathOverlap>true</allowSourcePathOverlap>
<definesDeclaration>
<property>
<name>ZEFIRO::META_INFO</name>
<value>"buildno=${zefiro.plugin.buildno}"</value>
</property>
</definesDeclaration>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.adobe.flex.framework</groupId>
<artifactId>flex-framework</artifactId>
<version>3.5.0.12683</version>
<type>pom</type>
<exclusions>
<!-- make sure to exclude the default 'playerglobal' transitive dependency (which would be version 9 for SDK 3.5, however, we want version 10) -->
<exclusion>
<groupId>com.adobe.flex.framework</groupId>
<artifactId>playerglobal</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.adobe.flex.framework</groupId>
<artifactId>playerglobal</artifactId>
<!-- this artifact version must match the flex SDK version used in this project -->
<version>3.5.0.12683</version>
<!-- the classifier specifies the target flash player major version (default is 9 for SDK 3.5) -->
<classifier>10</classifier>
<type>swc</type>
</dependency>
[... some more dependencies needed by all projects ...]
</dependencies>
<modules>
<module>../lib_swc</module>
<module>../project_swf</module>
[... calls all my projects ...]
</modules>
</project>
然后我可以编译我的SWC 图书馆项目使用这个简单的 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/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>Sample library project</name>
<artifactId>lib_swc</artifactId>
<packaging>swc</packaging>
<dependencies>
<dependency>
<groupId>${group-id}</groupId>
<artifactId>some_other_library</artifactId>
<version>${project.version}</version> <!-- I should probably look into dependency/versioning as well, but for now this works -->
<!-- Note: no 'Scope' here, swc files will be build "merged into code"-style. Needed as transitive dependencies don't work with Maven/Flex - we use 'external' scope for the final swf projects dependencies -->
<type>swc</type>
</dependency>
</dependencies>
</project>
And my SWF项目有了这个 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/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>Sample SWF module</name>
<artifactId>project_swf</artifactId>
<packaging>swf</packaging>
<build>
<!-- This name needs to be exactly specified, as the runtime will load it as it's specified in the configuration xml -->
<finalName>SampleProjectModule1</finalName>
<!-- define the master source file, it's picked up for some projects automatically and must be specified for others. Inherits compiler parameters from parent. -->
<plugin>
<groupId>org.sonatype.flexmojos</groupId>
<artifactId>flexmojos-maven-plugin</artifactId>
<version>3.7.1</version>
<configuration>
<sourceFile>project_swf_master_file.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 文件都会生成一个目标文件(用打包标签指定),并且在使用 Flex mojo 时,它需要采用 swf 或 swc 格式。我似乎无法在这里指定多个目标,并且还很难包含我的资源文件(Flex copy-resources 复制我不需要的 html 包装器(对于每个项目),普通资源标签复制资源,但不不打包它们)。现在我当前的工作版本是指定一个自己的程序集描述符,它将我的目标 .swf 文件与 WebContent/ 文件夹一起捆绑到一个 zip 文件中。 Maven 支持 jar/war/bin 文件,但这些文件似乎期望某些条件为真,这不适用于我的 Flex 项目(例如,我没有 web.xml)
swf- assembly.xml:
<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>WebContent</id>
<formats>
<format>zip</format>
</formats>
<includeBaseDirectory>false</includeBaseDirectory>
<fileSets>
<!-- Take the base 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>
<!-- add the WebContent folder -->
<fileSet>
<directory>FCPContent</directory>
<outputDirectory>/</outputDirectory>
</fileSet>
</fileSets>
</assembly>
现在,我已经获得了目标目录,其中包含单独的 .swf 文件和包含 .swf 文件以及 WebContent/ 资源的 zip 文件。在调用“mvn install”时它也会被放置在 Nexus 存储库中,因此这看起来是一个很好的进步。虽然如果更好的话我很乐意做完全不同的事情,因为我的最终目标是拥有一个目录(或包含它的 zip/war 文件),其中包含一些静态文件(我们的 html 包装器和加载器 swf + configuration.xml ),对于我们的每个 swf 项目(我们在运行时加载的模块),都有一个包含 .swf 文件和 WebContent/ 资源的目录 - 即我现在可以为每个项目创建的 zip 文件的内容。
index.html
loader.swf
config.xml
project_swf/SampleProjectModule1.swf
project_swf/assets/labels.xlf
project_swf/config/config.xml
project2_swf/module2.swf
project2_swf/cool_colors_stylesheet.swf
所以我的问题是:如何定义这样一个以这种格式创建最终程序集的 Maven 主项目?如果没有其他方法,一个有效的 ANT 文件可能是可以接受的,尽管我读到 Maven 敦促我们远离这些 hack :)
我还需要编译样式表文件,这些文件是 swf 项目的附加工件。我将为此发布一个单独的问题。