8

我有一个带有此清单的 Eclipse 插件:

...
Bundle-ClassPath: .,
 lib/drools-api.jar,
 lib/drools-core.jar,
...

现在我们不想把drools-api.jardrools-core.jar放在源代码控制中,所以我们使用插件从 maven 存储库中获取它们:

  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-dependency-plugin</artifactId>
    <executions>
      <execution>
        <id>copy-bundle-classpath-libs</id>
        <phase>validate</phase>
        <goals>
          <goal>copy</goal>
        </goals>
        <configuration>
          <outputDirectory>lib</outputDirectory>
          <overWriteReleases>true</overWriteReleases>
          <overWriteSnapshots>true</overWriteSnapshots>
          <overWriteIfNewer>true</overWriteIfNewer>
          <stripVersion>true</stripVersion>
          <artifactItems>
            <artifactItem>
              <groupId>org.drools</groupId>
              <artifactId>drools-api</artifactId>
            </artifactItem>
            <artifactItem>
              <groupId>org.drools</groupId>
              <artifactId>drools-core</artifactId>
            </artifactItem>
            ...

但是,我们第一次构建这个模块时,它失败了,因为发生了这种情况:

[WARNING] Missing classpath entry lib/drools-api.jar ...
[WARNING] Missing classpath entry lib/drools-core.jar ...
...
[INFO] --- maven-dependency-plugin:2.1:copy (copy-bundle-classpath-libs) ... ---
...
[INFO] Copying drools-api-5.2.0-SNAPSHOT.jar to .../lib/drools-api.jar
[INFO] Copying drools-core-5.2.0-SNAPSHOT.jar to .../lib/drools-core.jar
...
[INFO] --- maven-osgi-compiler-plugin:0.10.0:compile (default-compile) ... ---
...
[INFO] Compiling 458 source files to ...
// ERROR because drools-api is not in the compilation classpath

如果我们再次构建它,它会成功,因为在lib构建开始之前,jar 已经在目录中:没有警告,并且 jar 在编译类路径中。

我们如何解决这个问题,这样我们就不需要在源代码控制中提交 jars 并仍然使用Bundle-ClassPath

注意:插件的当前实现要求我们使用Bundle-ClassPath: usingRequire-Bundle不是一个选项。

4

2 回答 2

2

这是一个已知的错误。

https://issues.sonatype.org/browse/TYCHO-577

于 2011-02-16T16:43:07.420 回答
1

我曾尝试做类似的事情,但我的印象是这行不通。

似乎 maven-dependency-plugin 需要解析编译类路径才能下载 JAR(即使您通过 <artifactItems> 指定依赖项)。

因此,Tycho 驱动的类路径解析在 JAR 下载之前执行,因此它们不会进入类路径。一种鸡和蛋的问题。

为了解决这个问题,我创建了一个单独的配置文件“download-deps”,用于刷新库目录(如:)mvn -Pdownload-deps validate

但是,此方法不能很好地工作,因为如果存在 bundleB提供的导入包的包A,而后者又嵌入了包含该包的 JAR,则 B 的编译将因未解决的依赖关系而失败。因此,您必须运行此命令,直到下载所有 JAR。十分难看。

于 2011-02-16T15:47:06.223 回答