2013-04-26 2 views
7

Tycho 플러그인을 사용하여 Maven으로 빌드하는 Eclipse RCP 애플리케이션이 있습니다. 모듈로 모든 플러그인과 기능을 포함하는 마스터 POM이 있습니다.Tycho : 플러그인을 별도로 빌드 할 때 프로젝트의 다른 플러그인에 대한 종속성을 확인할 수 없습니다.

내가 인 경우 마스터 POM을 Maven과 함께 설치하면 결과 원자로 구조가 올바르게 작동합니다. 모든 모듈은 빌드이며 설치는에서 성공합니다. 그러나

, 내가 응용 프로그램 의 다른 플러그인을 별도로 이클립스 플러그인 중 하나의 종속을 구축하는 경우는를 확인할 수 없습니다.

타사 라이브러리에 대한 종속성 (예 : 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 웹 앱에서 나는 preferences 플러그인의 1.8.15-SNAPSHOT 빌드를 분명히 볼 수 있습니다. 그러나이 저장소는 액세스되지 않는 것 같습니다.

저장소 정보는 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) 

입니다

: 이것은 부모 POM (우리의 프로젝트는 마스터에서 분리주의가

<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) :

다음과
<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" 

답변

7

Tycho는 Maven 저장소가 OSGi 매니페스트에 지정된 종속성을 해결할 수있는 충분한 메타 데이터를 가지고 있지 않기 때문에 의존성을 해결하기 위해 Maven 저장소에서 찾지 않습니다. 대신, Tycho는 원격지에서 오는 인공물에 대한 p2 저장소가 필요합니다.,

  • 는 CI 빌드 반응기에서 모든 이슈를 모으는 P2 저장소를 생성 유무 :

    그래서 반응기의 부품 빌드의 사용 사례를 커버하기 위해, 다음을 수행해야 정적 URL에 해당 p2 저장소를 게시하십시오. (가장 간단한 해결책은 Jenkins 작업을 사용하고 빌드의 작업 공간을 가리키는 URL을 사용하는 것입니다.)

  • POM에서 레이아웃 p2가있는 저장소로 CI 빌드 p2 저장소를 추가하는 프로파일을 프로젝트에 작성하십시오 .

이렇게하면 다른 모듈을 동시에 빌드하지 않아도 프로젝트의 아티팩트가 모듈 target platform의 일부가됩니다.

+0

슬프게도 이것은 올바른 대답 인 것 같습니다. 왜 tycho가 로컬 Maven 레포 (p2도 아님)에서 유물을 찾을 수 있지만 회사 Maven 레파지토리에서는 찾을 수없는 이유는 무엇입니까? – tbacker

+2

Tycho는 로컬로 빌드 된 다른 아티팩트에 대한 빌드의 사용 사례를 지원하기 위해 [명시 적 지원 (http://wiki.eclipse.org/Tycho/Target_Platform#Locally_built_artifacts)] 기능을 제공합니다. 원격 리포지토리에 사용되는 것과 동일한 것이었지만, [본질적으로 확장되지 않습니다] (https://issues.sonatype.org/browse/TYCHO-335). – oberlies

+0

실제로 Nexus Maven 저장소를 사용하여 자동으로이 작업을 수행했습니다. Tycho 빌드 아티팩트 (예 : url 저장소/제품)를 배포하는 기본 Maven 저장소는 p2 레이아웃 (url 저장소/myproduct/.meta/p2)에 내용을 표시합니다. 우리 프로젝트의 리파지토리리스트에 두 URL을 모두 추가함으로써, 이것은 밖으로 작동하는 것처럼 보입니다! 전개 된 의존성은 해결되고 로컬 저장소'.m2/repository/p2/osgi/bundles' 내의 분리 된 디렉토리로 다운로드됩니다. – tbacker

1

난 당신이 단순히 받는다는 좌표뿐만 아니라 부모에 대한 상대 경로를 제공 할 필요가 있다고 생각합니다. 상대 경로가 없으면 상위 POM이 이미 로컬 Repo에 적어도있는 경우에만 작동합니다.

+0

저장소에서 상위 항목 검색이 작동합니다. 리포지토리가 설정 파일에 정의되어 있기 때문에 부모를 찾을 수 있습니다. 상대 경로를 사용하지 않는 이유는 매번 전체 응용 프로그램을 체크 아웃해야하기 때문입니다. 저장소에서 검색하여 항상 액세스 할 수 있습니다. – tbacker

+1

사실, 상대 경로를 지정합니다. 생략하면'relativePath'의 기본값은'..'입니다. 그러나 상대 경로가 가리키는 위치에 * 다른 POM이없는 한 이것은 문제가되지 않습니다. – oberlies