Использование Maven для создания проекта Flex, включая таблицы стилей - PullRequest
0 голосов
/ 18 марта 2011

Таблицы стилей Flex анализируются компилятором и связываются с их активами (обычно графикой) в файл swf, который затем можно загрузить во время выполнения. У меня есть проект с фиксированным количеством стилей (в настоящее время 4: старый корпоративный стиль, новый корпоративный стиль и высококонтрастные версии обоих). Используя Flash Builder (Eclipse с плагином Flex IDE), я могу собрать все файлы .css, скомпилированные в файлы .swf, вместе с основным файлом проекта .swf. Это также возможно с помощью скриптов ant.

В настоящее время я понимаю, что Maven хочет создать только один артефакт для каждого проекта (файл POM), но может добавить несколько дополнительных (например, упаковку в zip-архив). По причинам масштабируемости - у меня есть сложная настройка многих библиотечных и модульных проектов, некоторые из которых имеют свои собственные индивидуальные таблицы стилей - было бы очень непрактично разделять проекты на «основной» проект и копии для каждой таблицы стилей. По крайней мере, на стороне проекта Eclipse, возможно, сработали бы некоторые подпапки с файлами POM в каждой, на которые все ссылаются в файле master pom и ссылающиеся на один и тот же src / location (и находящийся внутри одного проекта Eclipse). Хотя это некрасиво и требует отдельных артефактов для каждого, и все же нужно как-то его собрать.

Важно иметь конечную сборку, которая содержит основной SWF-файл проектов (Eclipse) и каждый SWF-файл таблиц стилей (а также некоторые статические файлы, например локализованные тексты, загружаемые во время выполнения). Это будет частью большой сборки нескольких проектов, которые я описал в отдельном вопросе .

Я использую Eclipse 3.6.1 (Helios) с плагином Flash Builder (т. Е. Flex4), ориентируясь на Flex SDK 3.5 (FlashPlayer 10.0). Я установил Maven 3.0.2, используя Sonatypes flexmojos-maven-plugin 3.7.1 (так как он кажется более активным, чем один из Servebox ). Я вручную создал pom-файлы для своих проектов, и они работают (хотя компилируется только один файл артефакта SWF, в зависимости от того, указывал ли я основной .as или один из .css файлов в качестве sourceFile)

Я уже несколько дней пытаюсь понять «Путь Maven» (который, похоже, приспособлен для Java и не совсем подходит для Flex), но не смог заставить его работать так, чтобы у меня был один проект, или хотя бы одну сборку со всем в ней.

Какой лучший способ сделать это здесь?

1 Ответ

1 голос
/ 30 марта 2011

Я не нашел способа создать несколько артефактов из одного и того же POM-файла, даже запустить целевую сборку flexmojo более одного раза (даже при связывании с тегом выполнения Maven будет жаловаться). Таким образом, лучший способ, который я нашел, это использовать довольно похожее решение для моего общего проекта, который я описал в этом вопросе, включая мое решение , и которое я предлагаю прочитать, поскольку я буду опираться на это , Я надеялся на менее хакерское решение здесь, использование этого мультипроектного подхода кажется мне немного грязным. Вот почему я разделил вопрос, что, в свою очередь, дало мне честь быть замеченным самим Джеффом Этвудом:)

Я хочу использовать только один проект 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, поэтому я поместил дескриптор сборки для плагинов, содержащих таблицы стилей, в том же месте.

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>

Дескриптор сборки плагина объединяет все это. Он также находится в центре и, таким образом, написан в общем виде: он ссылается на идентификатор группы и artifactId из вызывающего POM и использует соглашение об именах, которое я представил. Окончательный проект будет построен сборкой POM, поэтому я указываю 'хороший' 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 (как показано в моем другом вопросе). Это облегчает указание правильного артефакта в общем модуле сборки, поскольку я могу просто использовать «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 /
  • Дублирование файла color_plugin / POMs / style1 / pom.xml в файл Colored_plugin / POMs / style2 / pom.xml
  • добавив его в color_plugin / pom.xm в качестве модуля
  • добавление его в color_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
...