1

我正在尝试使用 Flexmojos 7.0.0 和 mavenized Apache Flex SDK (groupId "org.apache...") 构建一个 Flex 项目,该项目依赖于使用 Flexmojos 5 和 Adob​​e Flex SDK 4.6.b.23201 构建的旧库(groupId“com.adobe ...”)。问题是它给出了以下错误:

错误] 无法在项目 gestouch-examples 上执行目标 net.flexmojos.oss:flexmojos-maven-plugin:7.0.0:compile-swf (default-compile-swf):执行目标 net.flexmojos 的 default-compile-swf。 oss:flexmojos-maven-plugin:7.0.0:compile-swf failed: Flex 编译器和 flex 框架版本不匹配。编译器:'4.12.1.20140427' - 框架:'4.1.0.16076'。

[错误] 您可以使用“iKnowWhatImDoingPleaseBreakMyBuildIwontBlameFlexmojosForStopWorking”禁用此检查。请参阅 Flexmojos Maven 文档。

[错误] 如果您更喜欢修复它而不是忽略它,请查看:https ://docs.sonatype.org/display/FLEXMOJOS/How+to+set+Flex+SDK+version

这是我的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>

    <groupId>mygroup</groupId>
    <artifactId>myartifact</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>swf</packaging>
    <name>Flexmojos7 Test</name>

    <properties>
        <flexmojos.version>7.0.0</flexmojos.version>
        <flex.version>4.12.1.20140427</flex.version>
        <flex-sdk.version>${flex.version}</flex-sdk.version>
    </properties>

    <build>
        <sourceDirectory>src/main/flex</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>net.flexmojos.oss</groupId>
                <artifactId>flexmojos-maven-plugin</artifactId>
                <version>${flexmojos.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <sourceFile>Main.mxml</sourceFile>
                    <debug>true</debug>
                    <storepass/>
                    <skipTest>true</skipTest>
                    <skipTests>true</skipTests>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.flex</groupId>
                        <artifactId>compiler</artifactId>
                        <version>${flex.version}</version>
                        <type>pom</type>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>org.apache.flex.framework</groupId>
            <artifactId>flex-framework</artifactId>
            <version>${flex.version}</version>
            <type>pom</type>
        </dependency>

        <!-- 3rd party libraries -->

        <dependency>
            <groupId>org.as3commons</groupId>
            <artifactId>as3commons-logging</artifactId>
            <version>2.7</version>
            <type>swc</type>
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>sonatype</id>
            <url>https://oss.sonatype.org/content/repositories/releases</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
        </repository>

        <repository>
            <!-- has as3commons -->
            <id>yoolab.org-releases</id>
            <url>http://dev.yoolab.org/maven/content/repositories/releases/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
</project>

如您所见, as3commons-logging 库是我提到的依赖项。如果你打开它的POM,你会看到它取决于

<groupId>com.adobe.flex.framework</groupId>
<artifactId>air-framework</artifactId>

<groupId>com.adobe.flex.framework</groupId>
<artifactId>common-framework</artifactId>

两者都有 4.1.0.16076 版本。

我对 Maven 比较陌生,当我在我的 POM 依赖项中指定 as3commons-logging 的类型为“swc”时,我个人不明白为什么它尊重 as3commons-logging POM。但是好的,经过一个周末的研究,我发现了如何通过为我的依赖项指定“排除”来解决这个问题:

<dependency>
    <groupId>org.as3commons</groupId>
    <artifactId>as3commons-logging</artifactId>
    <version>2.7</version>
    <type>swc</type>
    <exclusions>
        <exclusion>
            <groupId>com.adobe.flex.framework</groupId>
            <artifactId>air-framework</artifactId>
        </exclusion>
        <exclusion>
            <groupId>com.adobe.flex.framework</groupId>
            <artifactId>common-framework</artifactId>
        </exclusion>
    </exclusions>
</dependency>

通过我的 POM 中的这个修复,它最终可以编译。

现在,我的问题是——这是正确的解决方法吗?我是说概念上的。因为整个事情对我来说似乎不是很清楚。这是从 Adob​​e Flex 切换到 Apache Flex 的代价吗?

4

2 回答 2

0

抱歉,您的问题回复晚了。

这是您问题的答案:我注意到旧 FDK 的发布方式存在一些问题,并重构了结构以避免在生成新 FDK 时出现这些问题。我改变的一件事是消除了 flex-framework、air-framework 和 common-framework,因为它们混合了来自 Apache 和 Adob​​e 的依赖项。现在你所拥有的只是类似于通用框架 pom 的东西。org.apache.flex:framework:{fdkVersion}:pom 如果你引用 this 而不是 flex-framework 并添加一个依赖到 playerglobal 匹配你的最低 Flash 版本 com.adobe.flash.framework:playerglobal:{flashVersion}:swc 你应该准备好了。

我强烈建议切换到 Flexmojos 7.0.1(我几天前发布),因为它包含一些对烦人问题的修复。

<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>

    <groupId>mygroup</groupId>
    <artifactId>myartifact</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>swf</packaging>
    <name>Flexmojos7 Test</name>

    <properties>
        <flexmojos.version>7.0.1</flexmojos.version>
        <flex.version>4.12.1.20140427</flex.version>
        <flex-sdk.version>${flex.version}</flex-sdk.version>
        <flashplayer.version>11.1</flashplayer.version>
    </properties>

    <build>
        <sourceDirectory>src/main/flex</sourceDirectory>
        <plugins>
            <plugin>
                <groupId>net.flexmojos.oss</groupId>
                <artifactId>flexmojos-maven-plugin</artifactId>
                <version>${flexmojos.version}</version>
                <extensions>true</extensions>
                <configuration>
                    <sourceFile>Main.mxml</sourceFile>
                    <debug>true</debug>
                    <storepass/>
                    <skipTest>true</skipTest>
                    <skipTests>true</skipTests>
                </configuration>
                <dependencies>
                    <dependency>
                        <groupId>org.apache.flex</groupId>
                        <artifactId>compiler</artifactId>
                        <version>${flex.version}</version>
                        <type>pom</type>
                    </dependency>
                </dependencies>
            </plugin>
        </plugins>
    </build>

    <dependencies>
        <dependency>
            <groupId>com.adobe.flash.framework</groupId>
            <artifactId>playerglobal</artifactId>
            <version>${flashplayer.version}</version>
            <type>swc</type>
        </dependency>
        <dependency>
            <groupId>org.apache.flex</groupId>
            <artifactId>framework</artifactId>
            <version>${flex.version}</version>
            <type>pom</type>
        </dependency>

        <!-- 3rd party libraries -->

        <dependency>
            <groupId>org.as3commons</groupId>
            <artifactId>as3commons-logging</artifactId>
            <version>2.7</version>
            <type>swc</type>
            <!--exclusions>
                <exclude>
                    <groupId>....</groupId>
                    <artifactId>....</artifactId>
                </exclude>
            </exclusions-->
        </dependency>
    </dependencies>

    <repositories>
        <repository>
            <id>sonatype</id>
            <url>https://oss.sonatype.org/content/repositories/releases</url>
            <releases>
                <enabled>true</enabled>
                <updatePolicy>never</updatePolicy>
            </releases>
        </repository>

        <repository>
            <!-- has as3commons -->
            <id>yoolab.org-releases</id>
            <url>http://dev.yoolab.org/maven/content/repositories/releases/</url>
            <releases>
                <enabled>true</enabled>
            </releases>
        </repository>
    </repositories>
</project>

另一个问题可能是第三方库可能会引用其他版本中的工件。所以可能 as3commons-logging 是针对 adobe flex 版本编译的,所以你必须排除它。您可以通过发出以下命令来查看引入了哪些依赖项:

mvn dependency:tree

它应该输出一个依赖树,您可以在其中查看必须排除哪些库。

希望这可以帮助。

克里斯

于 2014-09-23T08:05:15.507 回答
-1

问题是 flexmojos-maven-plugin 7.0.x 版本是使用 Apache FDK 4.12.1.20140427 构建的

要通过 flexmojos 构建您的项目,您首先需要通过 mavenizer ( https://cwiki.apache.org/confluence/display/FLEX/Apache+Flex+SDK+Mavenizer ) 在您的 maven 存储库中部署这个 FDK (4.12.1.20140427 )。如果您有外部存储库(如 Nexus 服务器),则需要将此 FDK 部署到存储库中。然后您需要在 pluginRepositories 部分的 POM 文件中显式声明此存储库:

<!-- REPOS -->
<pluginRepositories>
    <pluginRepository>
        <id>flex-repository</id>
        <url>http://path-to-your-repository/</url>
    </pluginRepository>
</pluginRepositories>

<repositories>
    <repository>
        <id>flex-repository</id>
        <url>http://path-to-your-repository/</url>
    </repository>
</repositories>
于 2014-11-07T10:56:23.060 回答