34

かなりの数のサブモジュールを持つMavenプロジェクトがあります。私が探しているのは、集約POMの/ target /ディレクトリに含まれているサブモジュールによって生成されたすべての.jarファイルを取得して、後で便利に使用できるようにする方法です。

  • それらをマージする必要はありません。できればそうではありませんが、そうでなければならない場合は問題ありません。
  • 依存関係を気にしないでください
  • これは主に便宜上のものであり、現時点では

私がやろうとしていることの基本的なバージョン:

Prj1/pom.xml  =>  prj1/target/proj1.jar  (and classes/generated-sources/etc)
Prj2/pom.xml  =>  prj2/target/proj2.jar
Main/pom.xml  =>
                  main/target/proj1.jar
                  main/target/proj2.jar
                  ... classes/generated-sources not needed at all,
                  ... but they could be combined here.  I assume they will be

私は読んでいて、SOからのいくつかの提案も使用しています。これまでのところ、これを行う方法は見つかりませんでしたが、確かにあります。

編集:

含まれているすべてのサブプロジェクトについて、これを簡単な方法で機能させることを諦めました。私がこれまでに得た最善の答えは、依存関係プラグインを使用して、含めるすべてのサブモジュールを手動で(再度)指定することです。アイデアは、必要なモジュールを含めるだけで、すべてのサブモジュールのjarを1つの場所に魔法のように貼り付けることで、数十のクライアントに対してPOMを簡単に構成できるようにすることでした。Mavenは、あまり何もしない場合はかなりいいですが、試してみるとアングルブラケット税は信じられないほどです。

そのような標準的なタスク(SOで尋ねられた質問から判断すると、通常のプロジェクトで何が行われるか)が非常に難しいのはまだ奇妙だと思います。maven3の方が良いですか?

4

3 に答える 3

30

maven-dependency-plugin:copy plugin:goalを試すことができます。

コピーするすべてのサブモジュールの pom にこれを追加する必要があります。編集:または、親ポンだけで(コメントを参照)。

    <build>
        <plugins>
            <plugin>
              <groupId>org.apache.maven.plugins</groupId>
              <artifactId>maven-dependency-plugin</artifactId>
              <executions>
                <execution>             
                  <id>copy-artifact</id>
                  <phase>package</phase>
                  <goals>
                    <goal>copy</goal>
                  </goals>
                  <configuration>
                    <artifactItems>
                        <artifactItem>
                          <groupId>${project.groupId}</groupId>
                          <artifactId>${project.artifactId}</artifactId>
                          <version>${project.version}</version>
                          <type>${project.packaging}</type>
                        </artifactItem>
                    </artifactItems>
                    <outputDirectory>../Main/target/dependencies</outputDirectory>
                  </configuration>
                </execution>
              </executions>
            </plugin>
        </plugins>
    </build>

これを親 pom に入れる場合は、プロジェクト全体が 1 モジュールの深さである場合にのみうまく機能することに注意してください。親モジュールの下のモジュールに独自のサブモジュールがある場合、それらは目的のフォルダーに収まらないことを意味します。フォルダ構造は次のようになります。

- Parent
  - Module 1
    - Sub module 1
    **Main**
  - Module 2
  **Main**

これを防ぐには、上記の構成で専用のモジュールを作成し、コピーする各モジュールを手動で指定します。このようにして、モジュールの深さに関係なく、すべてのモジュールが 1 つのフォルダーにまとめられます。

于 2011-11-28T08:30:37.773 に答える
15

私はこれを解決するために一日を費やしました...そして最終的にはうまくいくので、私は厳しいスケジュールにありますが、将来誰かの欲求不満を救うことができれば、ここで共有します...

ステップ1。一緒にコピーするすべてのプロジェクトの親となる追加の Maven プロジェクトを作成します。このプロジェクトを としましょうparent

このプロジェクトは、一緒にビルドするプロジェクトを Maven に伝えるために必要です。また、他のプロジェクトで親が であることを宣言するため、ここで定義したプロパティparentが表示されます。MyDir

<groupId>com.your.domain</groupId>
<artifactId>parent</artifactId>
<version>0.0.1</version>
<packaging>pom</packaging>
<properties>
    <MyDir>/your/path/to/copy/to</MyDir>
</properties>
<modules>
    <module>../project1</module>
    <module>../project2</module>
    <module>../project2</module>
</modules>

ステップ 2。同じ場所にコピーするすべてのプロジェクトについて、その親がparentプロジェクトであることを指定します (親プロジェクトの正しい groupId と artifactId とバージョンを指定してください)。

<parent>
    <groupId>com.your.domain</groupId>
    <artifactId>parent</artifactId>
    <version>0.0.1</version>
    <relativePath>../parent</relativePath>
</parent>

また、これらのプロジェクトごとに、次のように jar および依存関係プラグインの設定も指定します。

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-jar-plugin</artifactId>
    <version>2.4</version>
      <configuration>
        <outputDirectory>${MyDir}</outputDirectory>
        <archive>
          <manifest>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
            <mainClass>com.your.domain.Program</mainClass>
          </manifest>
        </archive>
     </configuration>
</plugin>
<plugin>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <phase>install</phase>
        <goals>
          <goal>copy-dependencies</goal>
        </goals>
        <configuration>
          <outputDirectory>${MyDir}/lib</outputDirectory>
        </configuration>
      </execution>
    </executions>
</plugin>

次にmvn install、親プロジェクトで実行します。バム!

PS 上記は、すべてのプロジェクトが同じディレクトリ (子の隣の親プロジェクト) にあることを前提としていますが、必要に応じて相対パスを変更できます。

于 2013-03-21T15:30:23.313 に答える
3

これを実現する 1 つの方法は、 maven アセンブリ プラグインのmoduleSetオプションを使用することです。

このようなアセンブリ記述子 (リンクの例のバリエーション) を作成し、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>bin</id>
  <formats>
    <format>dir</format>
  </formats>
  <includeBaseDirectory>false</includeBaseDirectory>
  <moduleSets>
    <moduleSet>
      <useAllReactorProjects>true</useAllReactorProjects> 
      <binaries>
        <outputDirectory>/</outputDirectory>
        <unpack>false</unpack>
      </binaries>
    </moduleSet>
  </moduleSets>
</assembly>
于 2011-11-28T08:54:52.667 に答える