使用Karaf Maven插件检索每个依赖项并创建Karaf Archive

时间:2016-01-18 17:00:10

标签: osgi dependency-management apache-karaf karaf apache-servicemix

我正在使用ServiceMix 6.1.0(包含Karaf 3.0.5)并且我有一个Maven项目。我想使用karaf-maven-plugin创建一个Karaf存档(.kar)。

我理解使用Karaf Archive的目标:检索每个依赖项,以便.kar可以在脱机环境中部署。嗯......我以为我已经理解了...在创建.kar并部署之后,我收到了一个错误:

Error executing command: Can't install feature karafMavenPlugin/0.0.0:
Could not start bundle mvn:org.testng/testng/6.8.8 in feature(s) karafMavenPlugin-0.0.1-SNAPSHOT: 
Unresolved constraint in bundle org.testng [371]: 
Unable to resolve 371.0: 
missing requirement [371.0] osgi.wiring.package; (osgi.wiring.package=org.junit)

以下是pom.xml

<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>test</groupId>
  <artifactId>karafMavenPlugin</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>kar</packaging>
  <name>TestKarafMavenPlugin</name>

    <build>
        <plugins>
            <!-- Plugin to create .kar -->
            <plugin>
                <groupId>org.apache.karaf.tooling</groupId>
                <artifactId>karaf-maven-plugin</artifactId>
                <version>3.0.5</version>
                <extensions>true</extensions>
                <configuration>
                    <aggregateFeatures>true</aggregateFeatures>
                    <includeTransitiveDependency>true</includeTransitiveDependency>
                </configuration>
            </plugin>
        </plugins>
        <pluginManagement>
            <plugins>
                <!--This plugin's configuration is used to store Eclipse m2e settings 
                    only. It has no influence on the Maven build itself. -->
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                        <lifecycleMappingMetadata>
                            <pluginExecutions>
                                <pluginExecution>
                                    <pluginExecutionFilter>
                                        <groupId>
                                            org.apache.karaf.tooling
                                        </groupId>
                                        <artifactId>
                                            karaf-maven-plugin
                                        </artifactId>
                                        <versionRange>
                                            [3.0.5,)
                                        </versionRange>
                                        <goals>
                                            <goal>
                                                features-generate-descriptor
                                            </goal>
                                        </goals>
                                    </pluginExecutionFilter>
                                    <action>
                                        <ignore></ignore>
                                    </action>
                                </pluginExecution>
                            </pluginExecutions>
                        </lifecycleMappingMetadata>
                    </configuration>
                </plugin>
            </plugins>
        </pluginManagement>
    </build>
    <dependencies>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>6.8.8</version>
        </dependency>
    </dependencies>
</project>

以下是生成的feature.xml

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.1" name="karafMavenPlugin">
    <feature name="karafMavenPlugin" version="0.0.1-SNAPSHOT" description="TestKarafMavenPlugin">
        <bundle>mvn:org.testng/testng/6.8.8</bundle>
        <bundle>wrap:mvn:org.beanshell/bsh/2.0b4</bundle>
        <bundle>mvn:com.beust/jcommander/1.27</bundle>
    </feature>
</features>

为什么没有检索到JUnit依赖项?

我的猜测是karaf-maven-plugin无法检索pom.xml<optional><provided>的依赖关系。实际上,JUnit是TestNG的依赖项,这里是TestNG的pom.xml(只有依赖项):

<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/maven-v4_0_0.xsd">

  <modelVersion>4.0.0</modelVersion>
  <groupId>org.testng</groupId>
  <artifactId>testng</artifactId>
  <packaging>jar</packaging>
  <name>TestNG</name>
  <version>6.8.8</version>
  <description>TestNG is a testing framework.</description>
  <url>http://testng.org</url>

  <dependencies>
    <dependency>
      <groupId>org.apache.ant</groupId>
      <artifactId>ant</artifactId>
      <version>1.7.0</version>
      <optional>true</optional>
    </dependency>

    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.10</version>
      <optional>true</optional>
    </dependency>

    <dependency>
      <groupId>org.beanshell</groupId>
      <artifactId>bsh</artifactId>
      <version>2.0b4</version>
<!--
      <scope>provided</scope>
-->
    </dependency>

    <dependency>
      <groupId>com.google.inject</groupId>
      <artifactId>guice</artifactId>
      <version>2.0</version>
      <scope>provided</scope>
    </dependency>
    <dependency>
      <groupId>com.beust</groupId>
      <artifactId>jcommander</artifactId>
      <version>1.27</version>
    </dependency>
      <dependency>
        <groupId>org.yaml</groupId>
        <artifactId>snakeyaml</artifactId>
        <version>1.12</version>
      <optional>true</optional>
      </dependency>
  </dependencies>    
</project>

我们可以看到<optional>检索到非<provided>而非karaf-maven-plugin的所有依赖关系。

所以......我错了吗?这是预期的行为吗?如果是这种情况,是否有办法指示karaf-maven-plugin下载每个依赖项?

1 个答案:

答案 0 :(得分:1)

如关于scope的maven文档中所述:

  

提供

     

这很像compile,但表示您希望JDK或容器在运行时提供依赖项。例如,   在为Java Enterprise Edition构建Web应用程序时,您   将设置对Servlet API和相关Java EE API的依赖   提供范围,因为Web容器提供了这些类。   此范围仅适用于编译和测试类路径,   而且不是传递性的。

&#39;设置&#39;不可传递:当通过api请求maven依赖时,不会检索提供的依赖项。

因此,为了使用karaf-maven-plugin,您必须在pom中明确添加此依赖项。