如何禁用 karaf-maven-plugin 4 紧依赖约束检查

How to disable karaf-maven-plugin 4 tight dependency constraint checks

目前我正在从 karaf 3.0.5 升级到最新版本 4.0.2,我使用 karaf-maven-plugin 组装我自己的 karaf。这就是我的 pom 的样子。

<?xml version="1.0" encoding="UTF-8"?>
<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">

<parent>
    <groupId>my.own.group</groupId>
    <artifactId>assemble</artifactId>
    <version>1.14.0-SNAPSHOT</version>
    <relativePath>..</relativePath>
</parent>

<artifactId>karaf-customize</artifactId>
<modelVersion>4.0.0</modelVersion>
<packaging>karaf-assembly</packaging>

<dependencies>
    <dependency>
        <groupId>org.apache.karaf.features</groupId>
        <artifactId>framework</artifactId>
        <version>${karaf.version}</version>
        <type>kar</type>
    </dependency>
    <dependency>
        <groupId>org.apache.karaf.features</groupId>
        <artifactId>standard</artifactId>
        <classifier>features</classifier>
        <version>${karaf.version}</version>
        <type>xml</type>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.cxf.karaf</groupId>
        <artifactId>apache-cxf</artifactId>
        <classifier>features</classifier>
        <version>${cxf.version}</version>
        <type>xml</type>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>org.apache.karaf.features</groupId>
        <artifactId>enterprise</artifactId>
        <classifier>features</classifier>
        <version>${karaf.version}</version>
        <type>xml</type>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>my.own.group</groupId>
        <artifactId>kar-archive</artifactId>
        <version>1.14.0-SNAPSHOT</version>
        <type>pom</type>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>my.own.group</groupId>
        <artifactId>karaf-branding</artifactId>
        <version>1.14.0-SNAPSHOT</version>
        <optional>true</optional>
    </dependency>
    <dependency>
        <groupId>commons-io</groupId>
        <artifactId>commons-io</artifactId>
        <version>2.4</version>
    </dependency>
    <dependency>
        <groupId>com.alutam</groupId>
        <artifactId>ziputils</artifactId>
        <version>1.1</version>
    </dependency>
    <dependency>
        <groupId>wsdl4j</groupId>
        <artifactId>wsdl4j</artifactId>
        <version>1.6.3</version>
    </dependency>
</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.karaf.tooling</groupId>
            <artifactId>karaf-maven-plugin</artifactId>
            <version>${karaf.version}</version>
            <extensions>true</extensions>
            <configuration>
                <javase>1.8</javase>
                <bootFeatures>
                    <feature>jasypt-encryption</feature>
                    <feature>config</feature>
                    <feature>standard</feature>
                    <feature>region</feature>
                    <feature>management</feature>
                    <feature>bundle</feature>
                    <feature>package</feature>
                    <feature>kar</feature>
                    <feature>ssh</feature>
                    <feature>http</feature>
                    <feature>cxf</feature>
                    <feature>service-wrapper</feature>
                    <feature>jdbc</feature>
                    <feature>system</feature>
                </bootFeatures>
            </configuration>
        </plugin>
    </plugins>
</build>
</project>

使用此配置,我确实收到了几个依赖项的以下错误。

Caused by: org.osgi.framework.BundleException: Unsupported 'Bundle-ManifestVersion' value: 1
    at org.apache.karaf.features.internal.resolver.ResourceBuilder.doBuild(ResourceBuilder.java:88)
    at org.apache.karaf.features.internal.resolver.ResourceBuilder.build(ResourceBuilder.java:78)

我猜它发生在这个 parser. The reason is some old third party 库中,它们的清单文件中只设置了 Bundle-ManifestVersion: 1。 使用 karaf-maven-plugin 3.x 这一点都不重要。相比之下,karaf-maven-plugin 4.x 失败并显示上述消息。 我知道解决此问题的唯一方法是从源代码重建或再次 repack 孔罐。

是否有任何其他方式,例如配置 karaf-maven-plugin 来禁用此约束检查?因为再次将所有这些捆绑在一起 运行 需要大量工作。

我在更新到 Karaf 4 时遇到了同样的错误,你有两个选择:

使用 bndtools 的 Osgify 冲突依赖:

  1. Download bnd tools

  2. 打开一个shell你已经下载了bnd-2.4.0.jar.

  3. 类型: java -jar bnd-2.4.0.jar wrap -o osgify-dependency.jar dependency.jar 其中 dependency.jar 是您的第三方,osgify-dependency.jar 将是输出。

  4. 部署到 maven repo 覆盖以前的 maven 坐标,或者用不同的坐标部署你的第三方。

    mvn deploy:deploy-file -Dfile osgify-dependency.jar ..

启用包装协议

给你添加maven karaf插件wrap和wrapper特性。

因此您可以使用 wrap 协议来修复损坏的 MANIFEST.MF

karaf 的一些特性:

<bundle>wrap:mvn:group.id/third.party.artefact.id/version</bundle>

在你的 pom.xml 通知功能包装/包装器中。

 <plugin>
    <groupId>org.apache.karaf.tooling</groupId>
    <artifactId>karaf-maven-plugin</artifactId>
    <extensions>true</extensions>
    <executions>
    </executions>
    <configuration>

     <!-- no startupFeatures -->
     <bootFeatures>
      <feature>feature</feature>
      <feature>jaas</feature>
      <feature>shell</feature>
      <feature>ssh</feature>
      <feature>management</feature>
      <feature>bundle</feature>
      <feature>config</feature>
      <feature>deployer</feature>
      <feature>diagnostic</feature>
      <feature>instance</feature>
      <feature>kar</feature>
      <feature>log</feature>
      <feature>package</feature>
      <feature>service</feature>
      <feature>system</feature>
      <feature>wrap</feature>
      <feature>aries-blueprint</feature>
     </bootFeatures>
     <installedFeatures>
      ..
      <feature>wrapper</feature>
     </installedFeatures>
    </configuration>
   </plugin>

这里有我测试的完整代码:

https://github.com/antoniomaria/gazpachoquest/blob/master/karaf-assembly/pom.xml