我使用的是ServiceMix 6.1.0 (包含Karaf3.0.5),我有一个Maven项目。我想使用.kar创建一个Karaf ( karaf-maven-plugin )。
我理解使用Karaf的目标:检索每个依赖项,以便可以在脱机环境中部署.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指示下载的每个依赖项?
发布于 2016-01-24 16:42:01
如有关作用域的maven文档中所述:
提供 这与编译非常相似,但表示您希望JDK或容器在运行时提供依赖关系。例如,在为构建web应用程序时,您将将对Servlet和相关Java的依赖设置为提供的范围,因为web容器提供了这些类。此范围仅在编译和测试类路径上可用,且不可传递。
“提供”不是传递性的:当通过api请求maven依赖项时,不会检索所提供的依赖项。
因此,为了使用karaf plugin,您必须在pom中显式地添加此依赖项。
https://stackoverflow.com/questions/34860149
复制相似问题