11

私はMavenを初めて使用し、以前に数回学習しようとしたことがあり、Mavenを使用しないほうがよいと考えました。さて、(残念ながら) 貢献したいプロジェクトで Maven を使わなければなりません。この時点での私の問題は、パッケージングに関するものです。すべての依存関係を含む自己完結型 (別名「ファット」) jar を作成したいと思います。Maven で遊んでいる同僚が pom ファイルを手伝ってくれました。

私は彼の pom ファイルと SO のサンプルをチェックしました。xml は正当に見えますが、プラグインはまったく実行されていません。エラーが発生しないことに注意してください。「fatjar」が発生しないことを除いて、すべてがうまくいきます。この問題の原因は何ですか?

以下は、pom.xml の関連部分です。<configuration>とタグの配置に関して矛盾するコード サンプルを見<executions>てきました。

<plugin>
  <artifactId>maven-assembly-plugin</artifactId>
  <version>2.3</version>
  <executions>
    <execution>
        <id>make-jar-with-dependencies</id> <!-- this is used for inheritance merges -->
        <phase>package</phase> <!-- bind to the packaging phase -->
        <goals>
            <goal>single</goal>
        </goals>
    </execution>
  </executions>
  <configuration>
    <finalName>ProjectName</finalName>
    <appendAssemblyId>true</appendAssemblyId>
    <descriptorRefs>
      <descriptorRef>jar-with-dependencies</descriptorRef>
    </descriptorRefs>
    <archive>
      <manifest>
        <mainClass>org.mydomain.ProjectName</mainClass>
        <addClasspath>true</addClasspath>
      </manifest>
    </archive>
  </configuration>
</plugin>

Edit_1 @khmarbaisemvn clean packageによって要求されたコンソール出力

[INFO] 
[INFO] --- maven-clean-plugin:2.4.1:clean (default-clean) @ myproject ---
[INFO] Deleting /home/user/workspace/project/target
[INFO] 
[INFO] --- maven-resources-plugin:2.5:resources (default-resources) @ myproject ---
[debug] execute contextualize
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] Copying 41 resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:compile (default-compile) @ myproject ---
[WARNING] File encoding has not been set, using platform encoding UTF-8, i.e. build is platform dependent!
[INFO] Compiling 292 source files to /home/user/workspace/project/target/classes
[INFO] 
[INFO] --- maven-resources-plugin:2.5:testResources (default-testResources) @ myproject ---
[debug] execute contextualize
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/user/workspace/project/src/test/resources
[INFO] 
[INFO] --- maven-compiler-plugin:2.3.2:testCompile (default-testCompile) @ myproject ---
[INFO] Nothing to compile - all classes are up to date
[INFO] 
[INFO] --- maven-surefire-plugin:2.10:test (default-test) @ myproject ---
[INFO] No tests to run.
[INFO] Surefire report directory: /home/user/workspace/project/target/surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Results :
Tests run: 0, Failures: 0, Errors: 0, Skipped: 0
[INFO] 
[INFO] --- maven-jar-plugin:2.3.2:jar (default-jar) @ myproject ---
[INFO] Building jar: /home/user/workspace/project/target/myproject-2.0.jar
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 12.210s
[INFO] Finished at: Thu Jun 07 11:45:14 CEST 2012
[INFO] Final Memory: 18M/184M
[INFO] ------------------------------------------------------------------------
4

5 に答える 5

29

maven-shade-pluginを使用して uberjar を作成することをお勧めします。その意図はまさにその目的だからです。maven-assembly-plugin でも同様に実行できます。

だからあなたのポンを見た後、私は問題を理解しています。まず、プラグインを実行しないpluginManagement ブロックでmaven-assembly-plugin を定義しました。さらに、余分な依存関係として maven-assembly-plugin を個別に定義しました。つまり、pom から以下を削除するだけです。

<dependency>
   <groupId>org.apache.maven.plugins</groupId>
   <artifactId>maven-assembly-plugin</artifactId>
   <version>2.3</version>
   <type>maven-plugin</type>
</dependency>

次のように maven-assemblyr-plugin を定義する必要があります。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            ...all your configuration here..
        </plugin>
    </plugins>
</build>

さらに、代わりにリポジトリマネージャーが処理する必要がある多くのリポジトリ定義を見てきました。pom のリポジトリについては、 sonatype 情報を読むことをお勧めします。さらに、他の誰かがプロキシの背後でプロジェクトを使用することを考える必要があります。あなたのポンで彼は到達できません。

于 2012-06-07T09:35:19.677 に答える
3

私が持っていたエラーのもう 1 つの提案を提供したいと思います: 私の xml は次のようになりました:

<plugins>
    <plugin>
        <groupId>org.maven...</groupId>
        <artifactId>myArtifact</artifact>
        <configuration>
            <descriptorRefs>....</descriptorRefs>
            ...
            <executions>
                <execution>
                    <phase>package</phase>
                    ....
                </execution>
            </executions>
        </configuration>
    </plugin>
</plugins>

ブロック<executions>は、ブロックの子ではなく、兄弟である必要があります<configuration>。それを修正するとすぐに、プラグインがビルド内で再び実行を開始しました。

于 2012-11-27T04:17:27.853 に答える
1

代わりに、 shadeプラグインを使用することもできます(これは私が使用しているものです)。

依存関係は最終的な JAR に含まれていることに注意してください。

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-shade-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>shade</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <finalName>standalone-${artifactId}</finalName>
                <archive>
                    <manifest>
                        <mainClass>com.mypckg.Launcher</mainClass>
                    </manifest>
                </archive>
            </configuration>
        </plugin>
    </plugins>
</build>

よろしく

于 2012-06-07T10:07:52.613 に答える
0

依存関係は次のようになります

    <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-assembly-plugin</artifactId>
            <configuration>
                <descriptors>
                    <descriptor>src/main/assembly/assembly.xml</descriptor>
                </descriptors>
            </configuration>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>attached</goal>
                    </goals>
                </execution>
            </executions>
    </plugin>

また、 assembly.xml を定義する必要があります。ここに例を示します

<assembly>
    <formats>
        <format>zip</format>
    </formats>
    <includeBaseDirectory>false</includeBaseDirectory>
    <dependencySets>
        <dependencySet>
            <outputDirectory>/lib</outputDirectory>
        </dependencySet>
    </dependencySets>
    <fileSets>
        <!-- move all the .jar from target to /lib -->
        <fileSet>
            <directory>target</directory>
            <outputDirectory>/lib</outputDirectory>
            <includes>
                <include>*.jar</include>
            </includes>
            <!--  include *.jar places the same version of >App.jar
            twice in the lib, we need remove one -->
            <excludes>
                <exclude>App*.jar</exclude>
            </excludes>

        </fileSet>
        <!-- move .bat from scripts to /scripts -->
        <fileSet>
            <directory>src/main/assembly/scripts</directory>
            <outputDirectory>/bin</outputDirectory>
            <includes>
                <include>*.bat</include>
            </includes>
        </fileSet>
    </fileSets>
</assembly>
于 2012-06-07T09:45:27.963 に答える