【问题标题】:How to deploy OSGi bundle to Maven repo with deploy:deploy-file?如何使用 deploy:deploy-file 将 OSGi 包部署到 Maven 存储库?
【发布时间】:2011-11-16 10:07:48
【问题描述】:

我有一个由另一个团队使用 Maven 构建的 OSGi 包。 POM 文件将其打包声明为“bundle”并使用 Apache Felix 插件。

我需要将此工件部署到本地 Maven 存储库 (Nexus),以便我们的内部项目可以使用它。

我已使用deploy:deploy-file 目标将捆绑包部署到存储库,就像您使用标准 JAR 文件一样,这可以正常工作。我从包中提取了嵌入的 POM 并将其传递到命令行,所以命令行是:

mvn deploy:deploy-file -Dfile=3rdpartybundle.jar -DpomFile=pom.xml -DrepositoryId=internal -Durl=http://internalserver/nexus

问题是,当我这样部署它时,打包设置为捆绑,因此存储库中的工件名称以 .bundle 扩展名结束,而不是 .jar 扩展名。

现在,我们无法弄清楚如何将其声明为依赖项。如果我们这样声明:

        <dependency>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <type>bundle</type>
        </dependency>

我们收到一条错误消息,指出无法解决依赖关系。有趣的是,错误消息中的 GAV 坐标实际上具有“jar”作为依赖类型的值,即使我们将其设置为“bundle”。

如果我们把依赖改成:

        <dependency>
            <groupId>...</groupId>
            <artifactId>...</artifactId>
            <version>...</version>
            <type>jar</type>
        </dependency>

我们得到完全相同的未解决的依赖错误。

那么你应该如何将一个打包为一个包的工件部署到一个 Maven 存储库,以便它可以用作另一个项目的编译时依赖项?

谢谢

【问题讨论】:

  • 我意识到我对“本地存储库”一词的使用可能令人困惑。我正在尝试部署到远程服务器上的 Nexus 存储库。该服务器由我们团队中的每个人共享。当我说“本地”时,我想我的意思是“在我们局域网上的防火墙内”。

标签: maven osgi bundle nexus


【解决方案1】:

问题是正在构建“3rdpartybundle.jar”而没有设置 extensions=true 和/或支持的类型:

<plugin>
    <groupId>org.apache.felix</groupId>
    <artifactId>maven-bundle-plugin</artifactId>
...
    <extensions>true</extensions>
...
    <configuration>
        <supportedProjectTypes>
            <supportedProjectType>jar</supportedProjectType>
            <supportedProjectType>war</supportedProjectType>
        </supportedProjectTypes>

如果您无法解决上游问题,那么有几个选择;

1) 使用新项目 pom 将其重新打包为 Jar:

                    <plugin>
                            <groupId>org.apache.maven.plugins</groupId>
                            <artifactId>maven-dependency-plugin</artifactId>
                            <version>2.3</version>
                            <configuration>
                                    <actTransitively>false</actTransitively>
                                    <outputDirectory>target/classes</outputDirectory>
                                    <artifactItems>
                                            <artifactItem>
                                                    <groupId>3rd</groupId>
                                                    <artifactId>party</artifactId>
                                                    <version>X.Y.Z</version>
                                            </artifactItem>
                                    </artifactItems>
                            </configuration>
                            <executions>
                                    <execution>
                                            <goals>
                                                    <goal>unpack</goal>
                                            </goals>
                                            <phase>compile</phase>
                                    </execution>
                            </executions>
                    </plugin>

2) 尝试使用 mvn deploy:deploy-file-DgeneratePom=false -Dpackaging=jar -Dfile=/path/to/3rdpartybundle.jar 但不指定 -DpomFile= - 希望 3rdpartybundle.jar 中没有 META-INF/maven/pom.xml - 它应该可以使用它,但你需要指定 groupId/artifactId/version 参数,因为这些参数不会来自项目的 pom。

我知道我过去曾构建过 bundle 工件并将它们部署到我们的 nexus (v1.9.0.1) 中,Spring repo 中的那些也是类型为 bundle,但不记得有任何问题。 (顺便说一句,您不需要在依赖项声明中指定捆绑包,如果它是唯一应该推断的工件,则 AFAIK)

【讨论】:

  • 我在尝试部署使用“bundle”打包的文件时遇到了类似的问题。 “-DgeneratePom=false -Dpackaging=jar”是我需要的魔法。谢谢。
【解决方案2】:

首先,您是否尝试过在您的捆绑文件夹中简单地调用mvn deploy。如果distributionManagement 配置为部署到您的关系,我希望捆绑包得到、构建、测试和部署。
如果失败,您可以使用 nexus Web 界面手动将包导入托管存储库。

【讨论】:

  • 我认为你没有抓住重点。问题不是安装它,而是捆绑插件使用的“捆绑”类型。
  • 但在他的问题中,他说“3rdpartybundle.jar”在我看来,打包为“bundle”的项目工件是一个 jar 文件。据我在 Apache Felix Bundle 插件网站上看到的,它创建了一个 jar 文件作为工件。因此,如果工件被部署为“.bundle”,我会在部署之前检查是否配置了另一个可能重命名工件的插件。
  • 捆绑包来自另一家公司的团队。我们没有源等。我们正在尝试部署一个已经构建的包。
【解决方案3】:

感谢您的回答,我想我有一个解决方法(虽然我不会称之为解决方案)。

@earcar 走在正确的轨道上,尽管该解决方案并未利用 pom.xml 中的所有可用信息,而这些信息已在 3rd 方包中可用(尤其是依赖项)。

因此,尽管 deploy:deploy-file 的文档有点模糊,但似乎可行的是,您可以传递一个 pom.xml 文件 AND 还将包装参数设置为同时。所以我的命令行现在看起来像这样:

mvn deploy:deploy-file -Dfile=3rdpartybundle.jar -DpomFile=pom.xml -DrepositoryId=internal -Durl=http://internalserver/nexus -Dpackaging=jar

这样做,存储库中的 pom.xml 仍然显示打包类型为“bundle”,并包含所有依赖项等,但工件本身具有 .jar 文件扩展名。

那么当我们将依赖声明为 JAR 类型时,Maven 就能够成功解析它:

    <dependency>
        <groupId>...</groupId>
        <artifactId>...</artifactId>
        <version>...</version>
        <type>jar</type>
    </dependency>

这基本上解决了我们的问题。我不确定这是多么便携或可靠。 FWIW,我们正在运行 Maven 3.0.3

感谢您的帮助。

【讨论】:

    【解决方案4】:

    你可能想尝试完全删除类型,然后做一个简单的

    mvn install
    

    在包含你的 pom.xml 文件的目录中。

    【讨论】:

    • 啊,是的,我明白了。我以为您指的是本地存储库,但在第二次阅读时,它清楚地表明您的意思是 nexus。在我的 nexus 环境中,我们使用 bash shell 脚本来部署它们。所以,我和你一样有兴趣看看解决方案是什么!
    • 正确,我们肯定需要部署到运行 Nexus 的远程存储库,由整个团队共享。
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 2011-11-21
    • 2014-12-28
    • 2010-12-06
    • 1970-01-01
    • 2013-03-09
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多