首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将多个OSGi包与BND /Maven-BND插件合并?

如何将多个OSGi包与BND /Maven-BND插件合并?
EN

Stack Overflow用户
提问于 2009-08-12 15:37:06
回答 1查看 3.3K关注 0票数 2

我在我的应用程序中使用了一些现成的OSGi包,并希望将它们重新打包在一起,并将它们与尚未兼容OSGi的附加包一起重新打包到一个新的包中。

EclipseLink就是一个很好的例子,它可以作为几个OSGi包使用,其中大多数都是可选的,这取决于您想要做什么。我希望选择与我相关的包,添加数据库驱动程序(例如,MySQl JDBC连接器),并将它们重新打包到一个更易于部署的新包中。

我在使用Apache的maven包插件。我在没有源代码的情况下设置了一个新的Maven项目,添加了四个eclipselink和mysql连接器作为依赖项,并尝试了以下操作:

  • 使用<Embed-Dependency><Embed-Transitive>指令将所有依赖项包含在一个包中。问题:随着插件重写清单,来自eclipselink包(例如,javax.mail.internet)的可选依赖项成为必需的。最初的捆绑包在清单中包含"resolution=optional“,因此在清单中可以很好地工作。
  • 使用插件和jar-with-dependencies程序集的manifest目标,但这给了我基本相同的结果,只需要更多的工作。
  • 使用了插件的bundleall目标,这与我想要的不太一样,因为它再次创建了单独的捆绑包。更糟糕的是,因为现在这些包中没有它们的依赖项。

我将在Struts 2中面对类似的问题。我不会对此过于痴迷,只需要使用一堆独立的第三方捆绑包,但是如果我能更整洁地打包它们,我真的很愿意。我知道OSGi的一个特点是模块化,所以创建大包可以克服这一点,但是我觉得如果您的模块无论如何都是紧密耦合的,那么最好将它们放在一个包中。

当然,我可以手动调整舱单,但我绝对不想。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-08-13 11:19:05

正如美库达特所说,这可能不是一个鼓励的好做法,但由于你有自己的理由,这是一种你可以做穷人合并的方法。

假设您自己正在处理OSGi清单,那么您只需要在包阶段之前将包和jars中的所有类都放到目标/类目录中。

您可以使用依赖插件的解压缩依赖项或解压缩目标来完成这一任务。如果您想要处理所有的项目依赖项(或者那些遵循某种命名模式的依赖项或某个groupId中的依赖项)和解压缩目标,那么我将使用解包依赖项,如果您想要对要解压缩的工件有很好的控制(以牺牲冗长的POM为代价)。我将假设在我的示例中展开。每个解包都输出到项目的outputDirectory (即目标/类)。

注意,这将按照下载的顺序覆盖来自每个包的重复工件,因此清单将互相破坏。为了确保正确地管理工件,我会将解包目标绑定到早期阶段,以便在未打包的内容之上复制src/main/资源,而不是覆盖。在下面的示例中,这个阶段是生成资源,所以在本地编译之后就会发生。如果需要覆盖任何类,请使用较早的阶段来解压依赖项,如生成源。

下面的示例在将项目的资源复制到目标/类之前,将junit-3.8.1和commons 1.4 (仅是我声明的前两个依赖项)的内容解压缩到目标/类中。注意,版本是在我的依赖项部分中定义的。如果尚未将包/jars声明为依赖项,则还需要在artifactItem中声明版本。

代码语言:javascript
复制
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-dependency-plugin</artifactId>
  <executions>
    <execution>
      <id>unpack</id>
      <phase>generate-resources</phase>
      <goals>
        <goal>unpack</goal>
      </goals>
      <configuration>
        <artifactItems>
          <artifactItem>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <overWrite>false</overWrite>
            <outputDirectory>${project.build.outputDirectory}</outputDirectory>
          </artifactItem>
          <artifactItem>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <overWrite>false</overWrite>
            <outputDirectory>${project.build.outputDirectory}</outputDirectory>
          </artifactItem>
        </artifactItems>
        <overWriteReleases>false</overWriteReleases>
        <overWriteSnapshots>true</overWriteSnapshots>
      </configuration>
    </execution>
  </executions>
</plugin>
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1266977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档