将<outputdirectory>添加到pom </outputdirectory>时,类路径为空

时间:2012-03-30 12:53:40

标签: java maven classpath osgi

我使用这个简单的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]

为什么classpath为空? <outputDirectory>与它有什么关系?这是一个错误,还是我误解了什么?

修改 使用debug-output运行显示类路径确实与<outputDirectory>相同。默认情况下,这是mavens target目录,因此他会在那里找到要包含在类中的类。如果我更改它,它将指向一个不包含要包含的类的目录。令人困惑的是,documentation for the plugin表示<outputDirectory>是:

  

生成的包的目录。

这是一个错误吗?

3 个答案:

答案 0 :(得分:2)

outputDirectory也是编译类的编写位置 - 关于空类路径“dot”的错误是由于给maven-bundle-plugin一个空目录。

bundle插件将MANIFEST.MF写入outputDirectory位置,这也是它希望为bundle找到任何其他元数据(例如scr插件的输出)的地方。

您使用的是编译器插件吗?如果不是它看起来像bundle插件中的一个错误,它在调用编译器时不尊重outputDirectory(但在其他地方尊重它)。

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

答案 1 :(得分:1)

首先我建议检查你的捆绑配置,而且我永远不会在特定的平台相关路径中使用绝对路径,如D:\等。另一方面,Maven中的默认值是放置创建输出的目标文件夹。根据文档,必须有更多配置。

答案 2 :(得分:0)

这是一个疯狂的猜测,但请尝试D:/TestD:\\Test