2

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

典型的例子是 EclipseLink,它可以作为几个 OSGi 包提供,其中大部分是可选的,具体取决于您想要做什么。我想选择那些与我相关的包,添加数据库驱动程序(例如 MySQl JDBC 连接器)并将它们重新打包成一个更易于部署的新包。

我正在使用 Apache Felix 的 maven-bundle-plugin。我建立了一个没有源代码的新Maven项目,添加了四个eclipselink和mysql连接器作为依赖项并尝试了以下内容:

  • 使用<Embed-Dependency>and<Embed-Transitive>指令将所有依赖项包含在一个包中。问题:当插件重写清单时,需要来自 eclipselink 包的可选依赖项(例如 javax.mail.internet)。原始捆绑包在清单中包含“分辨率=可选”,因此没有它也可以正常工作。
  • 使用manifest插件和jar-with-dependencies程序集的目标,但这给了我基本相同的结果,只是需要更多的工作。
  • 使用了bundleall插件的目标,这不是我想要的,因为它再次创建了单独的包。更糟糕的是,因为现在这些包里面没有它们的依赖项。

我将面临 Struts 2 的类似问题。我不会对此感到痴迷,只是使用一大堆单独的第三方捆绑包,但如果我可以更整齐地打包它们,我真的很喜欢至。我知道 OSGi 的一个要点是模块化,因此创建大包会破坏这一点,但我觉得如果您的模块无论如何都是紧密耦合的,那么您不妨将它们放入单个包中。

当然,我可以手动调整清单,但我绝对不想这样做。

4

1 回答 1

2

正如 omerkudat 所说,这可能不是一个值得鼓励的好习惯,但由于你有你的理由,这是你可以进行穷人合并的一种方式。

假设您自己处理 OSGi 清单,您只需要在打包阶段之前将所有类从包和 jar 中获取到 target/classes 目录中。

您可以使用依赖插件的 unpack-dependencies 或 unpack 目标来执行此操作。如果您想处理所有项目依赖项(或遵循特定命名模式或特定 groupId 的项目依赖项),我将使用 unpack-dependencies;如果您想对要解包的工件进行精细控制(在冗长的 POM 的开销)。我将假设在我的示例中解包。每个解包都输出到项目的 outputDirectory(即目标/类)。

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

下面的示例将 junit-3.8.1 和 commons-io 1.4 的内容(只是我声明的前两个依赖项)解压到目标/类中,然后将项目的资源复制到那里。请注意,版本是在我的依赖项部分中定义的。如果您没有将包/jar 声明为依赖项,则还需要在 artifactItem 中声明版本。

<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>
于 2009-08-13T11:19:05.213 回答