【问题标题】:Use dependencies from Eclipse p2 repository in a regular Maven build?在常规 Maven 构建中使用来自 Eclipse p2 存储库的依赖项?
【发布时间】:2011-10-04 15:39:11
【问题描述】:

我想在“常规”Maven 3 构建(例如 JAR 或 WAR 打包)中使用来自远程 Eclipse p2 存储库的依赖项——所有这些都无需将 p2 存储库转换为本地 Maven 存储库(这就是 osgi-to -maven2 和 m4e 似乎可以)。

理想情况下,我只使用http://maven.eclipse.org/nexus/,但它(还没有?)包含很多捆绑包。

使用 Maven 的 systemPath 不算!

【问题讨论】:

    标签: java eclipse maven maven-3 dependency-management


    【解决方案1】:

    看起来我正在回答我自己的另一个问题..

    首先,您可以使用 Tycho 添加对来自 P2 存储库的包的依赖:

    • 将构建配置为使用 tycho-maven-plugin。
    • 指定 P2 存储库。
    • 将打包设置为“eclipse-plugin”。
    • 为您的构建创建一个清单并使用 Require-Bundle 来声明依赖项(例如 org.eclipse.xsd)。还要将 Bundle-Version 设置为我们在 pom.xml 中构建时使用的相同版本。

    让我们试一试:

    $ mvn dependency:tree
    [INFO] com.example:org.eclipse.xsd:eclipse-plugin:0.0.1
    [INFO] +- p2.eclipse-plugin:org.eclipse.xsd:jar:2.6.0.v20100914-1218:system
    [INFO] ...
    [INFO] \- p2.eclipse-plugin:org.eclipse.core.filesystem:jar:1.3.1.R36x_v20100727-0745:system
    

    我们的依赖已成功从 P2 存储库中解决。不幸的是,我们还没有完成。该依赖项已添加到系统范围,这意味着如果我们创建一个依赖于我们构建的 webapp,则不会包含工件。为了解决这个问题,我们首先将依赖项中包含的所有类解压缩到某个目录,然后将该目录重新打包为 jar 并将其用作我们构建的最终工件。

    对于第一部分(解包),我们将 maven-dependency-plugin 添加到我们的构建中,并将其配置为在打包阶段运行其解包依赖项目标。对于第二部分(重新打包),我们将 maven-assembly-plugin 添加到我们的构建中,并将其配置为在打包阶段运行其单一目标。我们还需要创建和配置自定义程序集描述符。

    我们的构建现在包含 3 个文件: pom.xml 中的构建文件:

    <project>
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.example</groupId>
        <artifactId>org.eclipse.xsd</artifactId>
        <version>0.0.1</version>
        <packaging>eclipse-plugin</packaging>
        <repositories>
            <repository>
                <id>helios</id>
                <layout>p2</layout>
                <url>http://download.eclipse.org/releases/helios</url>
            </repository>
        </repositories>
        <build>
            <plugins>
                <plugin>
                    <groupId>org.eclipse.tycho</groupId>
                    <artifactId>tycho-maven-plugin</artifactId>
                    <version>0.12.0</version>
                    <extensions>true</extensions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-dependency-plugin</artifactId>
                    <executions>
                        <execution>
                            <id>unpack-dependencies</id>
                            <phase>package</phase>
                            <goals>
                                <goal>unpack-dependencies</goal>
                            </goals>
                            <configuration>
                                <outputDirectory>${project.build.directory}/dependency</outputDirectory>
                                <overWriteReleases>false</overWriteReleases>
                                <overWriteSnapshots>true</overWriteSnapshots>
                            </configuration>
                        </execution>
                    </executions>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>2.2.1</version>
                    <configuration>
                        <descriptors>
                            <descriptor>src/main/assembly/repackaged.xml</descriptor>
                        </descriptors>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>
    

    META-INF/MANIFEST.MF 中的清单:

    Manifest-Version: 1.0
    Bundle-ManifestVersion: 2
    Bundle-Name: Ignored
    Bundle-SymbolicName: Ignored
    Bundle-Version: 0.0.1
    Require-Bundle: org.eclipse.xsd
    Bundle-Vendor: Ignored
    

    src/main/assembly/repackaged.xml中的程序集描述符:

    <assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
        <id>repackaged</id>
        <formats>
            <format>jar</format>
        </formats>
        <includeBaseDirectory>false</includeBaseDirectory>
        <fileSets>
          <fileSet>
            <directory>${project.build.directory}/dependency/</directory>
            <outputDirectory>/</outputDirectory>
            <useDefaultExcludes>true</useDefaultExcludes>
          </fileSet>
        </fileSets>
    </assembly>
    

    现在 mvn package 将创建一个 jar 文件,其中包含我们 P2 依赖项中的所有代码,重新打包为适当的 Maven 工件,准备在另一个项目中用作依赖项。

    $ jar tf target/org.eclipse.xsd-0.0.1-repackaged.jar 
    org/eclipse/xsd/ecore/XSDEcoreBuilder$1.class
    org/eclipse/xsd/ecore/XSDEcoreBuilder$2.class
    org/eclipse/xsd/ecore/XSDEcoreBuilder$Comparator.class
    org/eclipse/xsd/ecore/XSDEcoreBuilder$EffectiveOccurrence.class
    org/eclipse/xsd/ecore/XSDEcoreBuilder.class
    

    【讨论】:

    • 我不知道你在评论的后半部分礼貌地指的是什么。但一般来说,如果您不想使用第谷,您可以继续找到此问题的非第谷答案并在此处发布。
    • 这有一个缺点:如果您的 IDE 不理解 tycho/p2(即 Netbeans),那么它不会将 jar 添加到类路径中,并且您甚至不会有自动完成/导航虽然通过 Maven 构建确实有效。
    • 你能帮我解决一些类似的问题吗? stackoverflow.com/questions/38099426/…
    【解决方案2】:

    另一种方法是使用 b3 聚合器以符合 maven 的布局镜像 p2 存储库,如下所述:

    Consuming emf bundles from p2 with maven : b3

    然后可以使用提供的原始罐子。

    【讨论】:

      猜你喜欢
      • 2018-05-12
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-23
      • 2020-09-19
      相关资源
      最近更新 更多