我正在使用这个简单的pom.xml使用maven-bundle-plugin生成OSGi捆绑包:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
                             http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>de.test.osgi</groupId>
    <artifactId>test</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>bundle</packaging>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.felix</groupId>
                <artifactId>maven-bundle-plugin</artifactId>
                <version>2.3.7</version>
                <extensions>true</extensions>
            </plugin>
        </plugins>
    </build>
</project>
这可以按预期工作(该项目包含一个公共类,我已经验证该类可以在捆绑包中导出)。现在,如果我将以下<configuration>添加到插件中:
<configuration>
    <outputDirectory>D:\Test</outputDirectory>
</configuration>
构建失败,并出现以下错误:
[INFO] --- maven-bundle-plugin:2.3.7:bundle (default-cli) @ test ---
[WARNING] Bundle de.test.osgi:test:bundle:0.0.1-SNAPSHOT : Classpath is empty. Private-Package and Export-Package can only expand from the classpath when there is one
[WARNING] Bundle de.test.osgi:test:bundle:0.0.1-SNAPSHOT : Instructions in Private-Package, or -testpackages that are never used: .*
Classpath:
[ERROR] Bundle de.test.osgi:test:bundle:0.0.1-SNAPSHOT : The JAR is empty: dot
[ERROR] Error(s) found in bundle configuration
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.891s
[INFO] Finished at: Fri Mar 30 14:49:46 CEST 2012
[INFO] Final Memory: 8M/20M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.felix:maven-bundle-plugin:2.3.7:bundle (default-cli) on project test: Error(s) found in bundle configuration -> [Help 1]
为什么类路径为空? <outputDirectory>与它有什么关系?这是错误,还是我误解了?
编辑
通过运行debug-output可以发现类路径确实与<outputDirectory>相同。默认情况下,这是mavens target目录,因此他将在其中找到要包含在捆绑软件中的类。如果更改它,它将指向不包含要包含的类的目录。令人困惑的是,documentation for the plugin表示<outputDirectory>是:

生成的包的目录。

这是一个错误吗?

最佳答案

outputDirectory也是已编写类的写入位置-有关空类路径“点”的错误是由于给maven-bundle-plugin一个空目录所致。

软件包插件将MANIFEST.MF写入outputDirectory位置,这也是它希望在其中查找该软件包的任何其他元数据(例如scr插件的输出)的位置。

您在使用编译器插件吗?如果不是,则它看起来像是捆绑插件中的错误,它在调用编译器时不遵循outputDirectory(但是在其他所有地方都遵循它)。

正如@nobeh指出的,如果${project.build.outputDirectory}outputDirectory指向相同的位置,则应该没问题。

07-27 22:13