Создать многомодульный проект в maven

Я хотел бы создать многомодульное автономное приложение с maven.

В моем случае я хотел бы, чтобы проект «Загрузчик» (.jar) содержал все остальные проекты. Но теперь у меня есть только набор файлов .jar (loader.jar, crawler1.jar... и т. д.)

.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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javanix.jmetalcrawler</groupId>
    <artifactId>loader</artifactId>
    <version>1.0</version>


    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

</project>

.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/xsd/maven-4.0.0.xsd">


    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javanix.jmetalcrawler</groupId>
    <artifactId>Crawler-1</artifactId>
    <version>1.0</version>

    <dependencies>
        <dependency>
            <groupId>com.javanix.jmetalcrawler</groupId>
            <artifactId>loader</artifactId>
            <version>1.0</version>
        </dependency>
    </dependencies>

    <build>
        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.6</source>
                        <target>1.6</target>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>

</project>

родительский .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/xsd/maven-4.0.0.xsd">

    <modelVersion>4.0.0</modelVersion>

    <groupId>com.javanix.jmetalcrawler</groupId>
    <artifactId>parent</artifactId>
    <version>1.0</version>
    <packaging>pom</packaging>
    <name>jMetalCrawler</name>

    <modules>
        <module>Crawler-1</module>
        <module>Loader</module>
    </modules>


</project>

Жизненный цикл:

  1. скомпилировать «Загрузчик» (имеет интерфейсы/абстрактные классы)
  2. скомпилировать/упаковать 'crawler1' (так как это зависит от проекта 'Loader')
  3. скомпилировать/упаковать 'crawler2' (так как это зависит от проекта 'Loader')
  4. загрузчик пакетов с скомпилированными проектами «искателя»

P.S.:

  1. Спасибо Адриану Шуму, он дал идею сделать мой проект более понятным
  2. После реструктуризации моего проекта в проекте «Launcher» мы можем добавить зависимости через maven-assembly-plugin (@see http://rombertw.wordpress.com/2010/05/14/maven-recipe-building-an-aggregate-jar/)

person davs    schedule 26.11.2012    source источник


Ответы (2)


Я бы предложил такую ​​структуру проекта:

loader  (POM, multi-module)
  + loader-api  (JAR)
  + crawler1    (JAR, depends on loader-api)
  + crawler2    (JAR, depends on loader-api)
  + loader-app  (JAR, depends on loader-api, crawler1, crawler2.  
                 The standalone app is built here)

Разделив API, от которого зависят поисковые роботы, и само приложение, управлять всей структурой проекта становится намного проще. Кроме того, он более модульный, поскольку мы больше не смешиваем API с приложением.

person Adrian Shum    schedule 27.11.2012

Если вы под «многомодульным автономным приложением с maven» подразумеваете автономный исполняемый файл jar, который содержит все его зависимости, тогда onejar-maven-plugin может быть тем, что вы ищете. Примеры использования см. в документации.

person matsev    schedule 26.11.2012
comment
Спасибо за ваш ответ.. но.. проект загрузчика содержит базовые интерфейсы, которые используют проекты Crawler-x (поэтому проект Crawler-x зависит от загрузчика). И я хотел бы справиться с этим в родительском .pom - person davs; 27.11.2012