使用 Karaf Maven 插件检索每个依赖项并创建 Karaf 存档
Retrieving every dependencies with Karaf Maven Plugin and create Karaf Archive
我正在使用 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
下载 每个 依赖项?
如有关 scope 的 Maven 文档中所述:
provided
This is much like compile, but indicates you expect the JDK or a container to provide the dependency at runtime. For example,
when building a web application for the Java Enterprise Edition, you
would set the dependency on the Servlet API and related Java EE APIs
to scope provided because the web container provides those classes.
This scope is only available on the compilation and test classpath,
and is not transitive.
'provided' 不可传递:当通过 api 请求 Maven 依赖项时,不会检索提供的依赖项。
因此,为了使用 karaf-maven-plugin,您必须在 pom 中显式添加此依赖项。
我正在使用 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
下载 每个 依赖项?
如有关 scope 的 Maven 文档中所述:
provided
This is much like compile, but indicates you expect the JDK or a container to provide the dependency at runtime. For example, when building a web application for the Java Enterprise Edition, you would set the dependency on the Servlet API and related Java EE APIs to scope provided because the web container provides those classes. This scope is only available on the compilation and test classpath, and is not transitive.
'provided' 不可传递:当通过 api 请求 Maven 依赖项时,不会检索提供的依赖项。
因此,为了使用 karaf-maven-plugin,您必须在 pom 中显式添加此依赖项。