Вопрос

Я изо всех сил пытался заставить Maven2 сотрудничать со мной, и мне было интересно, есть ли у кого-нибудь идеи о том, как заставить это работать....Я работаю над проектом Flash, и мы рассматриваем возможность перехода от гибридного решения Flex4/FlashCS4 к чистому решению Flex4.Мы хотели бы использовать систему сборки Maven2, чтобы нашим разработчикам не приходилось вручную загружать, устанавливать и настраивать Flex4 на своих машинах.

Мне удалось создать одномодульный проект, используя Maven2 с Flex4 (я использую плагин Sonatype FlexMojos и их репозиторий Maven2, расположенный по адресу http://repository.sonatype.org/content/groups/flexgroup/).У меня действительно начинаются проблемы, когда дело доходит до создания этого мультимодуля....

Наш проект организован следующим образом:

 |- bin
 |  |- moduleX.swf
 |  |- moduleY.swf
 |  |- ...
 |- lib
 |  |- moduleA.swc
 |  |- moduleB.swc
 |  |- ...
 |- src
 |  |- moduleA
 |  |- moduleB
 |  |- ...
 |- test
 |  |- moduleA
 |  |- moduleB
 |  |- ...
 |- share
 |  |- asset1
 |  |- asset2
 |  |- ...
 |- ...

По сути, исходники каждого из наших модулей расположены в папке «src/<имя модуля>/», а исходные коды тестов — в папке «test/<имя модуля>/», при этом сгенерированные файлы SWF помещаются в «bin», а сгенерированные файлы SWC — в папку «bin». в «либ».Наши ресурсы (вещи, на которые мы хотели бы иметь возможность ссылаться с помощью тегов «@Embed» или «[Embed]») находятся в разделе «share».Я просмотрел ссылки по наследованию и агрегированию проектов, но, похоже, не нашел ничего, что позволило бы нам сохранить существующую структуру каталогов нашего проекта.Мы хотели бы, чтобы эта миграция была максимально быстрой, безболезненной и ненарушающей.Я был бы очень признателен, если бы кто-нибудь смог выяснить, как создать файл «pom.xml», который позволит нам сохранить нашу текущую инфраструктуру.

Это было полезно?

Решение

Если вы уверены в переходе на Maven 2, вам будет проще изменить структуру проекта, чтобы каждый модуль содержал свои собственные исходные коды и тесты и соответствовал соглашениям Maven.

Если вы действительно не можете этого сделать, вы можете создать параллельную иерархию модулей и настроить для каждого модуля относительные пути, указывающие на существующую структуру.В конечном итоге структура может выглядеть примерно так:

|- Maven Root
|   |- pom.xml
|   |- ModuleA 
|   |  |- pom.xml
|   |- ModuleB
|   |  |- pom.xml
|   |- ModuleX
|   |  |- pom.xml
|   |- ModuleY
|   |  |- pom.xml
|   |- asset1
|   |  |- pom.xml
|   |-...
|
|- Existing-Root
    |- bin
    |  |- moduleX.swf
    |  |- moduleY.swf
    |  |- ...
    |- lib
    |  |- moduleA.swc
    |  |- moduleB.swc
    |  |- ...
    |- src
    |  |- moduleA
    |  |- moduleB
    |-...

Вы также можете добавить временные помпоны, чтобы можно было создавать связанные наборы (например,а share pom, содержащий все общие модули).

Тогда вы могли бы:

  • настройте каждый pom с соответствующими относительными путями, чтобы он мог создавать свои источники.
  • настроить плагин-зависимости maven для распаковки Embed ресурсы в target/flex/resources
  • использовать build-helper-maven-плагин установить target/flex/resources в качестве местоположения ресурса (обратите внимание, что на самом деле это может не работать, поскольку плагин ожидает, что ресурсы для встраивания будут находиться в src/main/resources)
  • определить соответствующие зависимости между модулями.
  • использовать maven-antrun-плагин чтобы скопировать окончательные артефакты в существующий каталог bin (если вы попытаетесь использовать тот же выходной каталог, установив project.build.outputDirectory, но затем очистка одного модуля заблокирует другие сборки).

Вот пример конфигурации для выполнения этих шагов для одного из помп:

<build>
  <!--configure the source and test sources to point to the existing structure-->
  <sourceDirectory>
    ${baseDir}/../../Existing-Root/test/${project.artifactId}
  </sourceDirectory>
  <testSourceDirectory>
    ${baseDir}/../../Existing-Root/src/${project.artifactId}
  </testSourceDirectory>
  <plugins>
    <plugin>
     <groupId>org.sonatype.flexmojos</groupId>
     <artifactId>flexmojos-maven-plugin</artifactId>
     <version>3.2.0</version>
     <extensions>true</extensions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <executions>
        <execution>
          <id>unpack</id>
          <phase>generate-resources</phase>
          <goals>
            <goal>unpack</goal>
          </goals>
          <configuration>
            <artifactItems>
              <!--unpack asset1 to target/flex/resources, 
                define any additional artifacts for other shares-->
              <artifactItem>
                <groupId>my.group.id</groupId>
                <artifactId>asset1</artifactId>
                <version>1.0.0</version>
                <type>swf</type>
              </artifactItem>
            </artifactItems>
            <outputDirectory>
              ${project.build.directory}/flex/resources
            </outputDirectory>
            <overWriteReleases>false</overWriteReleases>
            <overWriteSnapshots>true</overWriteSnapshots>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <!--add target/flex/resources as a resource location-->
      <groupId>org.codehaus.mojo</groupId>
      <artifactId>build-helper-maven-plugin</artifactId>
      <version>1.3</version>
      <executions>
        <execution>
          <id>add-resource</id>
          <phase>generate-resources</phase>
          <goals>
            <goal>add-resources</goal>
          </goals>
          <configuration>
            <resources>
              <resource>
                <directory>
                  ${project.build.directory}/flex/resources
                </directory>
              </resource>
            </resources>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <artifactId>maven-antrun-plugin</artifactId>
      <executions>
        <execution>
          <phase>pre-integration-test</phase>
          <configuration>
            <tasks>
              <!--copy the final artifact to the module's bin directory-->
              <copy 
                file="${project.artifactId}-${project.version}.${project.packaging}"
                todir="${baseDir}/../../Existing-Root/bin/${project.artifactId}"/>
            </tasks>
          </configuration>
          <goals>
            <goal>run</goal>
          </goals>
        </execution>
      </executions>
    </plugin>
  </plugins>
  ...
 </build>

Другие советы

Многомодульный проект должен выглядеть так

Root
 |- Module a
 |  |- src
 |- Module b
 |  |- src
 |- Module c
 |  |- src

Наличие нескольких источников в одном проекте — это нормально, если вы планируете создать один артефакт, но Maven не будет сотрудничать, если вы пытаетесь создать несколько артефактов из нескольких источников в одном проекте.

Если вы не можете переместить исходное дерево;создайте многомодульную иерархию pom в текущей структуре и отредактируйте новые дочерние Pom, чтобы указать их каталоги src и test на текущие каталоги src и test исходной иерархии.

Вы также можете сделать так, чтобы все выходные папки указывали на одну и ту же папку.

root
 |- ModuleA
 |  |- pom.xml, src points to root/src/moduleA
 |- ModuleB
 |  |- pom.xml, src points to root/src/moduleB
 |- src
 |  |- moduleA
 |  |- moduleB
 |  |- ...
 |- test
 |  |- moduleA
 |  |- moduleB
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top