1

私は Java プロジェクトを構築するために Maven を使用するのはかなり初めてで、対処方法がわからない状況に遭遇しました。

私は 3 つの依存関係を持つ Java アプリケーションを持っていaます。ただし、構築しているプラ​​ットフォームによっては異なるアーティファクトになるため、これを実現するためにプロファイルを使用しました。ここに私のからのスニペットがあります:bccpom.xml

<profiles>
  <profile>
    <id>win32</id>
    <activation>
      <os>
        <family>windows</family>
        <arch>x86</arch>
      </os>
    </activation>
    <dependencies>
      <dependency>
        <groupId>com.seanbright</groupId>
        <artifactId>c-win32-x86</artifactId>
        <version>1.0.0</version>
      </dependency>
    </dependencies>
  </profile>
  <profile>
    <id>win64</id>
    <activation>
      <os>
        <family>windows</family>
        <arch>amd64</arch>
      </os>
    </activation>
    <dependencies>
      <dependency>
        <groupId>com.seanbright</groupId>
        <artifactId>c-win32-x86_64</artifactId>
        <version>1.0.0</version>
      </dependency>
    </dependencies>
  </profile>
</profiles>

aおよび成果物は、bプラットフォームに依存せず、プロファイルと共にアクティブ化されないため、POM レベルで依存関係としてリストされます。簡潔にするために、ここでは示していません。

ここで、プロジェクトの実行可能 JAR をビルドし、コードから生成された JAR と一緒にディレクトリに 、 、および を含めたいaのでb、最終的には次のようになります。clib/

target/my-project-1.0.0.jar
target/lib/a-1.0.0.jar
target/lib/b-1.0.0.jar
target/lib/c-1.0.0.jar

のマニフェストにmy-project-1.0.0.jarは適切なクラスパスが含まれているため、ダブルクリックしてアプリケーションを起動できます。dependency:copy-dependenciesjar:jarゴールを使用して、このすべてを機能させます。

<build>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-dependency-plugin</artifactId>
      <version>2.7</version>
      <executions>
        <execution>
          <id>copy-dependencies</id>
          <goals>
            <goal>copy-dependencies</goal>
          </goals>
          <configuration>
            <outputDirectory>${project.build.directory}/lib</outputDirectory>
            <overWriteReleases>false</overWriteReleases>
            <overWriteSnapshots>false</overWriteSnapshots>
            <overWriteIfNewer>true</overWriteIfNewer>
            <includeScope>runtime</includeScope>
          </configuration>
        </execution>
      </executions>
    </plugin>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.4</version>
      <configuration>
        <archive>
          <manifest>
            <mainClass>com.seanbright.myproject.Launch</mainClass>
            <addClasspath>true</addClasspath>
            <classpathPrefix>lib/</classpathPrefix>
          </manifest>
        </archive>
      </configuration>
    </plugin>
  </plugins>
</build>

そして...それは動作します。唯一の問題は、アクティブなプロファイルとして、またはアクティブなプロファイルに応じて、ディレクトリcにコピーされる(そしてマニフェストに追加される)ことです。lib/Class-Pathc-win32-x86-1.0.0.jarc-win32-x86_64-1.0.0.jarc-1.0.0.jar

の代わりにdependency:copywithを使用すると正しいファイル名になりますが、 のエントリは引き続き「完全修飾」アーティファクト名 (つまり) を参照します。destFileNamedependency:copy-dependenciesClass-Pathlib/c-win32-x86-1.0.0.jar

私はこれについて間違った方法で進んでいますか?私がやろうとしていることを達成するためのより簡単な方法はありますか?

4

1 に答える 1

1

クラスパスの設定: クラスパスの変更: カスタム クラスパス形式の使用では、次のように説明されています。

場合によっては、独自のアーカイブ内に、上記のクラスパス レイアウトのいずれにも準拠しないカスタム形式の依存関係アーカイブがある場合があります。アーカイブのマニフェスト クラスパス内で依存関係アーカイブのカスタム レイアウトを定義する場合は、次のように、 の値を持つ 要素と 要素を一緒に使用してみて<classpathLayoutType>ください。'custom'<customClasspathLayout>

<project>
  ...
  <build>
    <plugins>
      <plugin>
         <artifactId>maven-war-plugin</artifactId>
         <configuration>
           <archive>
             <manifest>
               <addClasspath>true</addClasspath>
               <classpathLayoutType>custom</classpathLayoutType>
               <customClasspathLayout>WEB-INF/lib/$${artifact.groupIdPath}/$${artifact.artifactId}-$${artifact.version}$${dashClassifier?}.$${artifact.extension}</customClasspathLayout>
             </manifest>
           </archive>
         </configuration>
      </plugin>
    </plugins>
  </build>
  ...
  <dependencies>
    <dependency>
      <groupId>commons-lang</groupId>
      <artifactId>commons-lang</artifactId>
      <version>2.1</version>
    </dependency>
    <dependency>
      <groupId>org.codehaus.plexus</groupId>
      <artifactId>plexus-utils</artifactId>
      <version>1.1</version>
    </dependency>
  </dependencies>
  ...
</project>

このクラスパスのレイアウトは、前の例よりも少し複雑です。構成の値がどのように<customClasspathLayout>解釈されるかを理解するには、値内の式を解決するときに適用される規則を理解しておくと役に立ちます。

  1. プレフィックスが存在する場合は、式からプレフィックスを削除し'artifact.'ます。
  2. リフレクションを使用して Artifact への参照として式を解決しようとします (たとえば'artifactId'、 method への参照になります'getArtifactId()')。
  3. 再びリフレクションを使用して、式を現在の Artifact の ArtifactHandler への参照として解決しようとします (たとえば'extension'、 method への参照になります'getExtension()')。
  4. 次のマッピングを含む、特殊なケースの Properties インスタンスのキーとして式を解決しようとします。
    • 'dashClassifier': アーティファクトに分類子がある場合、'- $artifact.classifier'これは になります。それ以外の場合、これは空の文字列です。
    • 'dashClassifier?': の同義語です'dashClassifier'
    • 'groupIdPath': これは、'$artifact.groupId'すべての'.'文字が に置き換えられたと同等です'/'

上記の構成を使用して生成されたマニフェスト クラスパスは次のようになります。

Class-Path: WEB-INF/lib/org/codehaus/plexus/plexus-utils-1.1.jar WEB-INF/lib/commons-lang/commons-lang-2.1.jar

これが役立つことを願っています。

于 2013-03-28T01:00:40.273 に答える