提问者:小点点

错误:Flex编译器和Flex框架版本不匹配。编译器:“X”-框架:“Y”


我正在尝试使用Flexmojos 7.0.0构建一个Flex项目

ERROR]无法在项目gestouch上执行goal net . flex mojos . OSS:Flex mojos-maven-plugin:7 . 0 . 0:compile-swf(default-compile-swf)-示例:执行goal net . Flex mojos . OSS:Flex mojos-maven-plugin:7 . 0 . 0:compile-swf失败:Flex编译器和Flex框架版本不匹配。编译器:“4 . 12 . 1 . 2014 04 27”-框架:“4.1.0.16076”。

[错误]您可以使用“iKnowWhatImDoingPleaseBreakMyBuildIwontBlameFlexmojosForStopWorking”来禁用此检查。请参考 Flexmojos maven doc。

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

这是我的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-log为“swc”类型时,它会尊重as3Commons-log 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中修复后,它终于可以编译了。

现在,我的问题是——这是正确的解决办法吗?我是说概念上。因为整件事对我来说似乎不是很清楚。这是从Adobe Flex转换到Apache Flex的代价吗?


共2个答案

匿名用户

很抱歉这么晚才回复你的问题。

以下是您问题的答案:我注意到旧的FDK发布方式存在一些问题,并在生成新的FDK时重构了结构以避免这些问题。我改变的一件事是取消了flex框架、air框架和公共框架,因为它们混合了Apache和Adobe的依赖关系。现在您所拥有的只是一些类似于公共框架pom的东西。org.apache.flex:framework:{fdkVersion}:pom如果你引用这个而不是flex框架,并添加一个与你的最低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>

另一个问题可能是第三方libs可能会引用其他版本中的工件。因此,as3commons日志记录可能是针对adobeflex版本编译的,因此您必须排除这一点。您可以通过发出以下命令来查看哪些依赖项被拉入:

mvn dependency:tree

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

希望这能有所帮助。

克里斯

匿名用户

问题是flexmojos-maven插件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 server ),您需要将这个FDK部署到存储库中。然后,您需要在POM文件的pluginRepositories部分显式声明这个存储库:

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