【问题标题】:How to disable karaf-maven-plugin 4 tight dependency constraint checks如何禁用 karaf-maven-plugin 4 紧密依赖约束检查
【发布时间】:2015-11-10 09:28:47
【问题描述】:

目前我正在从 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 中。原因是一些旧的third party 库在它们的清单文件中只设置了Bundle-ManifestVersion: 1。 对于 karaf-maven-plugin 3.x,这根本不重要。相反,karaf-maven-plugin 4.x 失败并显示上述消息。 我知道解决此问题的唯一方法是从源代码重建或再次repack 孔罐。

还有其他方法可以像 karaf-maven-plugin 的配置一样禁用此约束检查吗?因为要让所有这些捆绑包再次运行起来将是一项非常艰巨的工作。

【问题讨论】:

    标签: java maven apache-karaf


    【解决方案1】:

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

    Osgify 使用 bndtools 冲突依赖:

    1. Download bnd tools

    2. 打开一个您已下载 bnd-2.4.0.jar 的 shell。

    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 协议来修复损坏的 MANIFEST.MF

    在一些 karaf 功能中:

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

    在你的 pom.xml 中通知功能 wrap/wrapper。

     <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

    【讨论】:

    • 感谢您的回答。我认为 wrap 和 wrapper 是两个完全不同的功能。 Wrapper 使我能够让 karaf 作为服务运行。在 karaf4 之前,这被称为 service-wrapper。是的,我也使用了 wrap 功能来解决这个问题。我还必须提到,我删除了我的 Maven 父母。因为在可能的情况下,这提供了很多我在 karaf 部署中不需要的不必要的依赖项。
    • 你是绝对正确的,包装和包装是两个完全不同的东西,我只是把它们搞砸了。但是很高兴我们提出了相同的解决方案。
    猜你喜欢
    • 2015-06-21
    • 1970-01-01
    • 2018-02-28
    • 2013-11-16
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    • 2020-02-12
    • 1970-01-01
    相关资源
    最近更新 更多