10

Tycho プラグインを使用して Maven でビルドする Eclipse RCP アプリケーションがあります。すべてのプラグインと機能をモジュールとして含むマスター POM があります。

Maven を使用してマスター POMをインストールすると、結果として得られるリアクター ビルドは正常に動作します。すべてのモジュールがビルドされ、インストールが成功します。

ただし、Eclipseプラグインの 1 つを個別にビルドすると、アプリケーションの他のプラグインへの依存関係を解決できません

サードパーティ ライブラリ(Eclipse プラットフォームなど)への依存関係は正常に動作しているようです。そのタイプの依存関係のみを持つアプリケーションの Eclipse プラグインは、正常にビルドされます。

コンソール出力は次のとおりです。

[INFO] Resolving dependencies of MavenProject: com.mycompany.myproduct:com.mycompany.myproduct.gui.editors:1.8.15-SNAPSHOT @ /<path>/com.mycompany.myproduct.gui.editors/pom.xml
[INFO] Cannot complete the request.  Generating details.
[INFO] Cannot complete the request.  Generating details.
[INFO] {osgi.ws=gtk, osgi.os=linux, osgi.arch=x86, org.eclipse.update.install.features=true}
[ERROR] Cannot resolve project dependencies:
[ERROR]   Software being installed: com.mycompany.myproduct.gui.editors 1.8.15.qualifier
[ERROR]   Missing requirement: com.mycompany.myproduct.gui.editors 1.8.15.qualifier requires 'bundle com.mycompany.myproduct.preferences 1.8.15' but it could not be found
[ERROR] 
[ERROR] Internal error: java.lang.RuntimeException: "No solution found because the problem is unsatisfiable.": ["Unable to satisfy dependency from com.mycompany.myproduct.gui.editors 1.8.15.qualifier to bundle com.mycompany.myproduct.preferences 1.8.15.", "Unable to satisfy dependency from com.mycompany.myproduct.gui.editors 1.8.15.qualifier to bundle com.mycompany.myproduct.gui.utils 1.8.15.", "No solution found because the problem is unsatisfiable."] -> [Help 1]
org.apache.maven.InternalErrorException: Internal error: java.lang.RuntimeException: "No solution found because the problem is unsatisfiable.": ["Unable to satisfy dependency from com.mycompany.myproduct.gui.editors 1.8.15.qualifier to bundle com.mycompany.myproduct.preferences 1.8.15.", "Unable to satisfy dependency from com.mycompany.myproduct.gui.editors 1.8.15.qualifier to bundle com.mycompany.myproduct.gui.utils 1.8.15.", "No solution found because the problem is unsatisfiable."]
        at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:168)
        ...

リアクター ビルドが成功したため、すべてのプラグイン ビルドは会社のリポジトリにあります(Artifactory を使用しています)。Artifactory Web アプリでは、プラグインの 1.8.15-SNAPSHOT ビルドが存在することがはっきりとわかりますpreferences。ただし、このリポジトリにはアクセスしていないようです。

リポジトリ情報はsettings.xmlファイルで指定されます。親 POM がそのリポジトリから正常に取得されていることに注意してください。

[INFO] Scanning for projects...
Downloading: http://artifactory.buildnet.mycompany.com/artifactory/libs-snapshot-local/com/mycompany/myproduct/gui.parent/1.0-SNAPSHOT/maven-metadata.xml
Downloaded: http://artifactory.buildnet.mycompany.com/artifactory/libs-snapshot-local/com/mycompany/myproduct/gui.parent/1.0-SNAPSHOT/maven-metadata.xml (594 B at 3.3 KB/sec)

設定ファイルの内容は次のとおりです。

<settings>
  <servers>
    ... (only relevant for deploy)
  </servers>
  <mirrors>
    <mirror>
      <id>mycompany-remote-mirror</id>
      <name>mycompany remote repositories mirror</name>
      <url>http://artifactory.buildnet.mycompany.com/artifactory/remote-repos</url>
      <mirrorOf>*,!eclipse*,!mycompany-snapshots,!mycompany-releases</mirrorOf>
    </mirror>
  </mirrors>
  <profiles>
    <profile>
      <id>mycompany-default</id>
      <repositories>
        <repository>
          <id>mycompany-snapshots</id>
          <name>MyCompany snapshots repository</name>
          <releases>
            <enabled>false</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
          </releases>
          <snapshots>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>fail</checksumPolicy>
          </snapshots>
          <url>http://artifactory.buildnet.mycompany.com/artifactory/libs-snapshot-local</url>
          <layout>default</layout>
        </repository>
        <repository>
          <id>mycompany-releases</id>
          <name>MyCompany releases repository</name>
          <releases>
            <enabled>true</enabled>
            <updatePolicy>always</updatePolicy>
            <checksumPolicy>warn</checksumPolicy>
          </releases>
          <snapshots>
            <enabled>false</enabled>
            <updatePolicy>never</updatePolicy>
            <checksumPolicy>fail</checksumPolicy>
          </snapshots>
          <url>http://artifactory.buildnet.mycompany.com/artifactory/libs-release-local</url>
          <layout>default</layout>
        </repository>
      </repositories>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>mycompany-default</activeProfile>
  </activeProfiles>
</settings>

これは親 POM です (このプロジェクトでは、モジュールを含むマスター POM から分離されていることに注意してください)。

<project ...>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.mycompany.myproduct</groupId>
  <artifactId>gui.parent</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>pom</packaging>

  <properties>
    <product-id>MyProduct</product-id>
    <tycho.version>0.17.0</tycho.version>
    <tycho-extras.version>0.17.0</tycho-extras.version>
    <eclipse.version>juno</eclipse.version>
    <eclipse.repo>http://download.eclipse.org/releases/${eclipse-version}</eclipse.repo>
  </properties>

  <distributionManagement>
    ...
  </distributionManagement>

  <repositories>
    <repository>
      <id>eclipse</id>
      <url>${eclipse.repo}</url>
      <layout>p2</layout>
    </repository>
  </repositories>

  <build>
    <plugins>
      <plugin>
        <groupId>org.eclipse.tycho</groupId>
        <artifactId>tycho-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <groupId>org.eclipse.tycho</groupId>
        <artifactId>target-platform-configuration</artifactId>
      </plugin>
      <plugin>
        <groupId>org.eclipse.tycho</groupId>
        <artifactId>tycho-source-plugin</artifactId>
      </plugin>
      <plugin>  
        <groupId>org.eclipse.tycho</groupId>  
        <artifactId>tycho-versions-plugin</artifactId>  
      </plugin>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-release-plugin</artifactId>
      </plugin>
    </plugins>

    <pluginManagement>
      <plugins>
        <!-- PARENT PLUGINS -->
        <plugin>
          <groupId>org.eclipse.tycho</groupId>
          <artifactId>tycho-maven-plugin</artifactId>
          <version>${tycho.version}</version>
          <extensions>true</extensions>
        </plugin>
        <plugin>
          <groupId>org.eclipse.tycho</groupId>
          <artifactId>target-platform-configuration</artifactId>
          <version>${tycho.version}</version>
          <configuration>
            ...
          </configuration>
        </plugin>
        <plugin>
          <groupId>org.eclipse.tycho</groupId>
          <artifactId>tycho-source-plugin</artifactId>
          <version>${tycho.version}</version>
          ...
        <plugin>  
          <groupId>org.eclipse.tycho</groupId>  
          <artifactId>tycho-versions-plugin</artifactId>  
          <version>${tycho.version}</version>
        </plugin>
        <plugin>
          <groupId>org.apache.maven.plugins</groupId>
          <artifactId>maven-release-plugin</artifactId>
          <version>2.4.1</version>
        </plugin>
        <!-- END OF PARENT PLUGINS -->

        <!-- DEFAULT PLUGINS -->
        <plugin>
          <groupId>org.eclipse.tycho</groupId>
          <artifactId>tycho-compiler-plugin</artifactId>
          <version>${tycho.version}</version>
          <configuration>
            <compilerArguments>
              <inlineJSR/>
              <enableJavadoc/>
              <encoding>ISO-8859-1</encoding>
            </compilerArguments>
          </configuration>
        </plugin>
        <!-- END OF DEFAULT PLUGINS -->

        <!-- OTHER PLUGINS -->
        ... (maven-resources, tycho-surefire, tycho-p2, tycho-p2-director,
             tycho-p2-repository, ...)
        <!-- END OF OTHER PLUGINS -->
      </plugins>
    </pluginManagement>
  </build>
</project>

他に依存するプラグインの POM.xml は次のとおりです。

<project ...>
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.mycompany.myproduct</groupId>
    <artifactId>gui.parent</artifactId>
    <version>1.0-SNAPSHOT</version>
  </parent>
  <artifactId>com.mycompany.myproduct.gui.editors</artifactId>
  <version>1.8.15-SNAPSHOT</version>
  <packaging>eclipse-plugin</packaging>
</project>

同じプラグインの MANIFEST.MF ファイルは次のとおりです。

Manifest-Version: 1.0
Bundle-ManifestVersion: 2
Bundle-Name: MyProduct Editors Plug-in
Bundle-SymbolicName: com.mycompany.myproduct.gui.editors;singleton:=true
Bundle-Version: 1.8.15.qualifier
Bundle-Activator: com.mycompany.myproduct.gui.editors.Activator
Bundle-ActivationPolicy: lazy
Export-Package: com.mycompany.myproduct.gui.editors,
 com.mycompany.myproduct.gui.editors.logger,
 com.mycompany.myproduct.gui.editors.report
Bundle-Vendor: MyCompany
Bundle-RequiredExecutionEnvironment: JavaSE-1.6
Require-Bundle: org.eclipse.ui.workbench;bundle-version="3.104.0",
 org.eclipse.core.runtime;bundle-version="3.8.0",
 org.eclipse.jface;bundle-version="3.8.0",
 com.mycompany.myproduct.preferences;bundle-version="1.8.15",
 com.mycompany.myproduct.gui.utils;bundle-version="1.8.15",
 org.eclipse.ui.workbench;bundle-version="3.104.0"
4

2 に答える 2

9

Tycho は、その依存関係を解決するために Maven リポジトリーを調べません (Maven リポジトリーには、OSGi マニフェストで指定された依存関係を解決するための十分なメタデータがないため)。代わりに、Tycho は、リモートから来るアーティファクト用に p2 リポジトリを必要とします。

したがって、reactor のパーツのビルドのユース ケースをカバーするには、次のことを行う必要があります。

  • CI ビルドで、リアクターからのすべてのアーティファクトを集約する p2 リポジトリを生成し、その p2 リポジトリを静的 URL で公開します。(最も簡単な解決策は、Jenkins ジョブを使用し、ビルドのワークスペースを指す URL を使用することです。)
  • CI ビルド p2 リポジトリをレイアウト p2 のリポジトリとして POM に追加するプロファイルをプロジェクトに作成します。

このように、他のモジュールを同時にビルドしなくても、プロジェクトの成果物もモジュールのターゲット プラットフォームの一部になります。

于 2013-04-26T13:42:05.937 に答える
1

Maven座標に加えて、親への相対パスを提供するだけでよいと思います。相対パスがないと、親 pom が少なくともローカル リポジトリにある場合にのみ機能します。

于 2013-04-26T12:59:10.013 に答える