Coder Social home page Coder Social logo

gradle-karaf-plugin's Introduction

gradle-karaf-plugin

badge badge :license apache brightgreengradle karaf plugin

Features

  • ✓ Karaf features

  • ✓ Karaf KAR

  • ❏ Karaf custom distribution

  • ❏ Nice documentation

Tasks

Automatically generate Karaf feature file in /build/karaf/features

gradle generateFeatures

Automatically generate Karaf repo (system directory) in /build/karaf/repo

gradle generateRepo

Automatically generate Karaf kar file in /build/karaf/kar

gradle generateKar

Description

The gradle-karaf-plugin is designed to automate the process of creating Apache Karaf feature, repo, and kar files.

This plugin generates the desired karaf files by utilizing the native gradle configurations mechanism. As gradle automatically determines all direct and transitive dependencies, a complete list of dependencies is provided to the plugin for a given set of configurations.

As OSGi can only install bundles, standard jars must be wrapped to add necessary manifest information specifying the jar’s import and export packages. To simply this process Karaf provides a native wrap tool that can be run during jar/bundle installation. This plugin determines if each dependency is already a bundle and adds the wrap tag if it is not (see example below).

Notes

  • Considering that gradle automatically "promotes" dependency version conflicts, only a single version of a dependency is avalible per each gradle configuration. As OSGi bundles can mandate certain versions of dependencies, it is likely that multiple versions of a jar/bundle are needed. In this case, it is recommended to add another gradle configuration, perhaps "karaf", and specify the other dependency version under this new configuration. Include both configurations to the karaf→features→feature→configurations statement (see example below). This will result in both versions of the dependency being added to the feature/kar file.

  • Karaf 4 support requires the xsd version be at least 1.3.0.

  • This plugin is an extension of the previous gradle-karaf-feature-plugin

Requirements

  • Gradle 3.0+

Usage

plugins {
    id 'com.github.lburgazzoli.karaf' version '0.0.49'
}

repositories {
    mavenCentral()
}

Or for compatibility with old versions of Gradle:

apply plugin: 'com.github.lburgazzoli.karaf'

buildscript {
    dependencies {
        classpath "gradle.plugin.com.github.lburgazzoli:gradle-karaf-plugin:0.0.49"
    }
}

repositories {
    mavenCentral()
}

Example

build.gradle

plugins {
    id 'java' //required only for runtime configuration
    id 'com.github.lburgazzoli.karaf' version '0.0.49'
}

repositories {
    mavenCentral()
}

group   = 'com.github.lburgazzoli'
version = '0.0.1'

configurations {
    foo
    bar
    // This will avoid adding transitive dependencies
    baz {
        transitive = false
    }
}

dependencies {
    runtime 'com.google.guava:guava:19.0'

    foo 'commons-io:commons-io:2.4'

    bar (
      'com.fasterxml.jackson.core:jackson-core:2.7.0',
      'com.fasterxml.jackson.core:jackson-databind:2.7.0',
      'com.fasterxml.jackson.core:jackson-annotations:2.7.0'
    )

    baz 'com.squareup.retrofit2:retrofit:2.0.0'
}

karaf {
    features {
        // See section below for karaf 4 support if using 1.3.0
        xsdVersion  = '1.2.0'
        name = "${project.name}-${version}"
        outputFile = file("${project.buildDir}/karaf/features/${project.name}-${project.version}-feature.xml")
        version     = '4.0.0' // Your project version
        description = 'Karaf features'

        // Include the current project, false by default
        includeProject = false

        // Add in extra repositories to the features xml file
        repository "mvn:org.apache.karaf.features/standard/4.0.0/xml/features"

        // Define a feature named 'my-feature1' with dependencies from runtime configuration (default if java plugin is enabled) and 'foo'
        feature {
            name        = 'my-feature1'
            description = 'Includes runtime and foo dependencies'

            // Include one or more additional configuration
            configuration 'foo'
        }

        // Define a feature named 'my-feature2' with dependencies from 'bar' and 'baz' configurations
        feature {
            name        = 'my-feature2'
            description = 'Includes runtime, bar and baz dependencies'

            // Override configurations
            configurations 'bar', 'baz'
        }

        feature {
            name        = 'my-feature3'
            description = 'Feature with capabilities'

            // Override configurations
            configurations 'foo', 'bar'

            // Add feature dependency (newest)
            feature 'aries-proxy'

            // Customize artifacts with group 'com.fasterxml.jackson.core'
            bundle ('com.fasterxml.jackson.core') {
                attribute 'start-level', '20'
            }

            conditional('bundle') {
                bundle 'commons-io:commons-io'
            }
            capability('osgi.service') {
                effective = 'active'
                extra     = 'objectClass=org.apache.aries.blueprint.services.ParserService'
            }

            capability('osgi.extender') {
                extra     = 'osgi.extender="osgi.blueprint";uses:="org.osgi.service.blueprint.container,org.osgi.service.blueprint.reflect";version:Version="1.0"'
            }
        }

        // Define a feature named 'my-feature4'
        feature {
            name        = 'my-feature4'
            description = 'Feature with config file'

            configurations 'foo'

            // Add configFile entry
            configFile {
                filename = "/etc/my-file.xml"
                uri      = "mvn:com.my.company/my.artifact/${project.version}/xml/my-file"
            }

            // Add configFile entry and copy a local file to the kar repository
            configFile {
                filename = '${karaf.etc}/my.Config.cfg'
                file     = file("resources/my.Config.cfg")
                uri      = "mvn:com.my.company/my.artifact/${project.version}/cfg/features"
                override = true // (optional) Override existing configuration files within karaf. False by default
            }
        }
    }

    // Enable generation of an OSGi bundles repository, laid out as a Maven 2 repository based on
    // the features defined above. This can be used to provision the 'system' directory of a
    // custom Karaf distribution.
    // To generate repo use generateRepo, assemble or install
    repo {
    }

    // Enable generation of Karaf Archive KAR based on features defined above.
    // To generate kar either use generateKar, assemble or install
    kar {
        // Optionally set the kar name, default is:
        //
        //     ${features.name}-${features.version}.kar
        //
        // Extension is automatically set to .kar
        archiveName = 'foo'
    }
}

Generated Result from "gradle generateFeatures"

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.2.0" name="my.project-0.0.1">
  <repository>mvn:org.apache.karaf.features/standard/4.0.0/xml/features</repository>
  <feature name="my-feature1" version="0.0.1" description="Includes runtime and foo dependencies">
    <bundle>mvn:com.google.guava/guava/19.0</bundle>
    <bundle>mvn:commons-io/commons-io/2.4</bundle>
  </feature>
  <feature name="my-feature2" version="0.0.1" description="Includes runtime, bar and baz dependencies">
    <bundle>mvn:com.fasterxml.jackson.core/jackson-core/2.7.0</bundle>
    <bundle>mvn:com.fasterxml.jackson.core/jackson-annotations/2.7.0</bundle>
    <bundle>mvn:com.fasterxml.jackson.core/jackson-databind/2.7.0</bundle>
    <!--
        as squareup's jars a re not OSGi ready, the plugin automatically adds wrap instruction
    -->
    <bundle>wrap:mvn:com.squareup.retrofit2/retrofit/2.0.0</bundle>
  </feature>
  <feature name="my-feature3" version="0.0.1" description="Feature with capabilities">
    <feature>aries-proxy</feature>
    <bundle start-level="20">mvn:com.fasterxml.jackson.core/jackson-core/2.7.0</bundle>
    <bundle start-level="20">mvn:com.fasterxml.jackson.core/jackson-annotations/2.7.0</bundle>
    <bundle start-level="20">mvn:com.fasterxml.jackson.core/jackson-databind/2.7.0</bundle>
    <conditional>
      <condition>bundle</condition>
      <bundle>mvn:commons-io/commons-io/2.4</bundle>
    </conditional>
    <capability>osgi.service;effective:='active';resolution:='mandatory';objectClass=org.apache.aries.blueprint.services.ParserService</capability>
    <capability>osgi.extender;effective:='resolve';resolution:='mandatory';osgi.extender="osgi.blueprint";uses:="org.osgi.service.blueprint.container,org.osgi.service.blueprint.reflect";version:Version="1.0"</capability>
  </feature>
  <feature name="my-feature4" version="0.0.1" description="Feature with config file">
    <configfile finalname="/etc/my-file.xml">mvn:com.my.company/my.artifact/0.0.1/xml/my-file</configfile>
    <configfile finalname="${karaf.etc}/my.Config.cfg" override="true">mvn:com.my.company/my.artifact/0.0.1/cfg/features</configfile>
    <bundle>mvn:commons-io/commons-io/2.4</bundle>
  </feature>
</features>

Karaf 4 Support

Karaf 4 features xsd v1.3.0 partially supported

<feature version="1.2.3" dependency="true">dependent-feature</feature>

To generate this stuff

  1. Set xsdVersion to 1.3.0

  2. Use dependency with configuration closure

karaf {
  features {
    xsdVersion = '1.3.0'
    name = "${project.name}-${version}"
    outputFile = file("${project.buildDir}/karaf/features/${project.name}-feature.xml")
    mainFeature {
      name = 'main-feature-name'
      feature('dependent-feature') {
        dependency = true              //false by default
        version = "1.2.3"              //empty by default
      }
    }
  }
}

generated file build/karaf/features/project1-feature.xml will look like below

<features xmlns='http://karaf.apache.org/xmlns/features/v1.3.0' name='featuresName'>
  <feature name='main-feature-name' version='1.0.0'>
    <feature version="1.2.3" dependency="true">dependent-feature</feature>
  </feature>
</features>

gradle-karaf-plugin's People

Contributors

eximius313 avatar gitter-badger avatar jrhoades22 avatar lburgazzoli avatar swarringa avatar tonit avatar vlsi avatar yrashk avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

gradle-karaf-plugin's Issues

Disable automatic wrapping for WAR projects

I'm having some issues creating a working features.xml using the gradle configuration setup with a WAR project. The WAR project alone builds correctly, and an osgi friendly WAR is created that I can deploy in karaf.

However, when I add it to the features gradle file is produces the following:
<bundle>mvn:com.project.blah/gradeWeb/2.1.0-SNAPSHOT</bundle> <bundle>war:mvn:com.project.blah/gradeWeb/2.1.0-SNAPSHOT/war</bundle>

(Or if the line jar.enabled = false is in the project's build.gradle)
<bundle>wrap:mvn:com.project.blah/gradeWeb/2.1.0-SNAPSHOT</bundle> <bundle>war:mvn:com.project.blah/gradeWeb/2.1.0-SNAPSHOT/war</bundle>

For both of these cases I just need to remove the first line and the project works. Is there any way to recognize the bundle as a WAR file, or perhaps disable the automatic wrapping for the individual project?

In case it is useful, the relevant gradle files are included as follows;

The features build.gradle:

configurations {
     myConfig
 }

karaf {
 features {
     feature {
         configuration 'myConfig'
     }
 }
}

dependencies {
 myConfig project(':my-war-project')
}

The build.grade for my-war-project:

apply from: "$root/gradle/includes/base.gradle"
apply plugin: 'war'
apply plugin: 'osgi'

jar.enabled = false

dependencies {
	providedCompile "javax.servlet:servlet-api:2.5"
}

war {
	manifest = osgiManifest {
		instruction 'Web-ContextPath', '/context-path'
		instruction 'Webapp-Context', '/context-path'
		instruction 'Bundle-ClassPath', '.;/WEB-INF/classes'

		classesDir = project.sourceSets.main.output.classesDir
		classpath = project.configurations.runtime
	}
}

Adding Repositories to Features

You should be able to add repositories to the features file:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<features xmlns="http://karaf.apache.org/xmlns/features/v1.3.0" name="example" >
    
    <repository>mvn:org.apache.camel.karaf/apache-camel/2.17.0/xml/features</repository>
    <feature name="project" >
     ......
    </feature>
</features>

Example code doesn't seem to work

Sorry if this isn't really a bug, but there isn't a lot of documentation. I tried using the example, and I got "Could not find matching constructor for: com.github.lburgazzoli.gradle.plugin.karaf.features.model.FeatureDescriptor(org.gradle.api.internal.project.DefaultProject_Decorated)"

It looks like that class's constructor takes a project, so I tried doing "feature (project(':lparent:web:karaf-features:bundles-feature'))", but that didn't work either.

Stack overview during deps walk with a particular dependency

When I have this dependency in one of my subprojects:

compile 'com.jcabi:jcabi-github:0.28'

the plugin throws java.lang.StackOverflowError (see below). As long as the dependency is removed, everything works just fine. Not exactly sure what's the culprit just yet.

Caused by: java.lang.StackOverflowError
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure6.doCall(KarafUtils.groovy:47)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:42)

KAR not being properly updated?

I just found out that the plugin might not be updating the KAR file properly.

Imagine I had one KAR build done:

➜  build git:(master) ✗ ls -la karaf/kar/project-1.0.0-SNAPSHOT.kar
-rw-r--r--  1 yrashk  staff  18159730 21 Mar 10:48 karaf/kar/project-1.0.0-SNAPSHOT.kar

Then I changed one source file, regenerated KAR (gradle generateKar) and we can
see that the timestamp has changed, but the size didn't:

➜  build git:(master) ✗ ls -la karaf/kar/project-1.0.0-SNAPSHOT.kar
-rw-r--r--  1 yrashk  staff  18159730 21 Mar 10:51 karaf/kar/project-1.0.0-SNAPSHOT.kar

Now, if I clean it up:

➜  build git:(master) ✗ rm -rf karaf

And rebuild it again, then the file is new:

➜  build git:(master) ✗ ls -la karaf/kar/project-1.0.0-SNAPSHOT.kar
-rw-r--r--  1 yrashk  staff  18159783 21 Mar 10:51 karaf/kar/project-1.0.0-SNAPSHOT.kar

gradle generateFeatures fails in multi project build with dependency substitution

mock.zip
Hi,

I suspect this is a problem of the plugin. The problem encountered is that gradle generateFeatures will fail in a multi project build scenario if dependency substitution is configured (flow-collection/build.gradle). If you commented out the following lines, the build will pass. mock examples attached (will need to correct the maven repo url for your setup).

Please let me know your thoughts. Thanks. /Jian

dependency.useTarget targetProject

**** build log and stack trace *****

Selected primary task 'generateFeatures' from project :

FAILURE: Build failed with an exception.

  • What went wrong:
    Could not determine the dependencies of task ':flow-collector:generateFeatures'.

Could not resolve all task dependencies for configuration ':flow-collector:runtime'.
Could not resolve com.nokia.nsp.flow:flow-collector-common:18.12.0-rel.+.
Required by:
project :flow-collector
> Project :flow-collector declares a dependency from configuration 'compile' to configuration 'default' which is not declared in the descriptor for project :flow-collector-common.

  • Try:
    Run with --debug option to get more log output. Run with --scan to get full insights.

  • Exception is:
    org.gradle.api.internal.tasks.TaskDependencyResolveException: Could not determine the dependencies of task ':flow-collector:generateFeatures'.
    at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.getDependencies(CachingTaskDependencyResolveContext.java:66)
    at org.gradle.execution.taskgraph.TaskDependencyResolver.resolveDependenciesFor(TaskDependencyResolver.java:46)
    at org.gradle.execution.taskgraph.LocalTaskInfo.getDependencies(LocalTaskInfo.java:89)
    at org.gradle.execution.taskgraph.LocalTaskInfo.resolveDependencies(LocalTaskInfo.java:62)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionPlan.addToTaskGraph(DefaultTaskExecutionPlan.java:168)
    at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph.addTasks(DefaultTaskExecutionGraph.java:126)
    at org.gradle.execution.TaskNameResolvingBuildConfigurationAction.configure(TaskNameResolvingBuildConfigurationAction.java:47)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54)
    at org.gradle.execution.DefaultTasksBuildExecutionAction.configure(DefaultTasksBuildExecutionAction.java:44)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.access$000(DefaultBuildConfigurationActionExecuter.java:25)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter$1.proceed(DefaultBuildConfigurationActionExecuter.java:54)
    at org.gradle.execution.ExcludedTaskFilteringBuildConfigurationAction.configure(ExcludedTaskFilteringBuildConfigurationAction.java:47)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.configure(DefaultBuildConfigurationActionExecuter.java:48)
    at org.gradle.execution.DefaultBuildConfigurationActionExecuter.select(DefaultBuildConfigurationActionExecuter.java:36)
    at org.gradle.initialization.DefaultGradleLauncher$CalculateTaskGraph.run(DefaultGradleLauncher.java:305)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    at org.gradle.initialization.DefaultGradleLauncher.constructTaskGraph(DefaultGradleLauncher.java:190)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:145)
    at org.gradle.initialization.DefaultGradleLauncher.executeTasks(DefaultGradleLauncher.java:124)
    at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:77)
    at org.gradle.internal.invocation.GradleBuildController$1.call(GradleBuildController.java:74)
    at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:154)
    at org.gradle.internal.work.StopShieldingWorkerLeaseService.withLocks(StopShieldingWorkerLeaseService.java:38)
    at org.gradle.internal.invocation.GradleBuildController.doBuild(GradleBuildController.java:96)
    at org.gradle.internal.invocation.GradleBuildController.run(GradleBuildController.java:74)
    at org.gradle.tooling.internal.provider.ExecuteBuildActionRunner.run(ExecuteBuildActionRunner.java:28)
    at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35)
    at org.gradle.tooling.internal.provider.ValidatingBuildActionRunner.run(ValidatingBuildActionRunner.java:32)
    at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner$3.run(RunAsBuildOperationBuildActionRunner.java:50)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    at org.gradle.launcher.exec.RunAsBuildOperationBuildActionRunner.run(RunAsBuildOperationBuildActionRunner.java:45)
    at org.gradle.tooling.internal.provider.SubscribableBuildActionRunner.run(SubscribableBuildActionRunner.java:51)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:47)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter$1.transform(InProcessBuildActionExecuter.java:44)
    at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:79)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:44)
    at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:30)
    at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:39)
    at org.gradle.launcher.exec.BuildTreeScopeBuildActionExecuter.execute(BuildTreeScopeBuildActionExecuter.java:25)
    at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:80)
    at org.gradle.tooling.internal.provider.ContinuousBuildActionExecuter.execute(ContinuousBuildActionExecuter.java:53)
    at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:62)
    at org.gradle.tooling.internal.provider.ServicesSetupBuildActionExecuter.execute(ServicesSetupBuildActionExecuter.java:34)
    at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:36)
    at org.gradle.tooling.internal.provider.GradleThreadBuildActionExecuter.execute(GradleThreadBuildActionExecuter.java:25)
    at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:43)
    at org.gradle.tooling.internal.provider.ParallelismConfigurationBuildActionExecuter.execute(ParallelismConfigurationBuildActionExecuter.java:29)
    at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:59)
    at org.gradle.tooling.internal.provider.StartParamsValidatingActionExecuter.execute(StartParamsValidatingActionExecuter.java:31)
    at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:59)
    at org.gradle.tooling.internal.provider.SessionFailureReportingActionExecuter.execute(SessionFailureReportingActionExecuter.java:44)
    at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:46)
    at org.gradle.tooling.internal.provider.SetupLoggingActionExecuter.execute(SetupLoggingActionExecuter.java:30)
    at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:52)
    at org.gradle.internal.Actions$RunnableActionAdapter.execute(Actions.java:207)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:402)
    at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:375)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:37)
    at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:23)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:368)
    at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:298)
    at org.gradle.launcher.Main.doAction(Main.java:36)
    at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:60)
    at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:37)
    at org.gradle.launcher.GradleMain.main(GradleMain.java:23)
    Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveException: Could not resolve all task dependencies for configuration ':flow-collector:runtime'.
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.rethrowFailure(DefaultConfiguration.java:1054)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1700(DefaultConfiguration.java:123)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationTaskDependency.visitDependencies(DefaultConfiguration.java:1539)
    at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext$TaskGraphImpl.getNodeValues(CachingTaskDependencyResolveContext.java:96)
    at org.gradle.internal.graph.CachingDirectedGraphWalker$GraphWithEmpyEdges.getNodeValues(CachingDirectedGraphWalker.java:211)
    at org.gradle.internal.graph.CachingDirectedGraphWalker.doSearch(CachingDirectedGraphWalker.java:121)
    at org.gradle.internal.graph.CachingDirectedGraphWalker.findValues(CachingDirectedGraphWalker.java:73)
    at org.gradle.api.internal.tasks.CachingTaskDependencyResolveContext.getDependencies(CachingTaskDependencyResolveContext.java:64)
    ... 76 more
    Caused by: org.gradle.internal.resolve.ModuleVersionResolveException: Could not resolve com.nokia.nsp.flow:flow-collector-common:18.12.0-rel.+.
    Required by:
    project :flow-collector
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.calculateTargetConfigurations(EdgeState.java:169)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.attachToTargetConfigurations(EdgeState.java:112)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.attachToTargetRevisionsSerially(DependencyGraphBuilder.java:315)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolveEdges(DependencyGraphBuilder.java:202)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.traverseGraph(DependencyGraphBuilder.java:155)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.DependencyGraphBuilder.resolve(DependencyGraphBuilder.java:126)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.DefaultArtifactDependencyResolver.resolve(DefaultArtifactDependencyResolver.java:123)
    at org.gradle.api.internal.artifacts.ivyservice.DefaultConfigurationResolver.resolveGraph(DefaultConfigurationResolver.java:167)
    at org.gradle.api.internal.artifacts.ivyservice.ShortCircuitEmptyConfigurationResolver.resolveGraph(ShortCircuitEmptyConfigurationResolver.java:89)
    at org.gradle.api.internal.artifacts.ivyservice.ErrorHandlingConfigurationResolver.resolveGraph(ErrorHandlingConfigurationResolver.java:73)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$5.run(DefaultConfiguration.java:533)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveGraphIfRequired(DefaultConfiguration.java:524)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.resolveToStateOrLater(DefaultConfiguration.java:509)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration.access$1800(DefaultConfiguration.java:123)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies.assertArtifactsResolved(DefaultConfiguration.java:1270)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies.access$3000(DefaultConfiguration.java:1159)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies$LenientResolutionResult.resolve(DefaultConfiguration.java:1285)
    at org.gradle.api.internal.artifacts.configurations.DefaultConfiguration$ConfigurationResolvableDependencies$LenientResolutionResult.getRoot(DefaultConfiguration.java:1298)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$_walkDeps_closure3.doCall(KarafUtils.groovy:39)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils.walkDeps(KarafUtils.groovy:37)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafUtils$walkDeps.call(Unknown Source)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafPlugin$_apply_closure5$_closure6.doCall(KarafPlugin.groovy:75)
    at com.github.lburgazzoli.gradle.plugin.karaf.KarafPlugin$_apply_closure5.doCall(KarafPlugin.groovy:69)
    at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingClosure$1$1.run(DefaultListenerBuildOperationDecorator.java:186)
    at org.gradle.configuration.internal.DefaultUserCodeApplicationContext.reapply(DefaultUserCodeApplicationContext.java:58)
    at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingClosure$1.run(DefaultListenerBuildOperationDecorator.java:181)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.configuration.internal.DefaultListenerBuildOperationDecorator$BuildOperationEmittingClosure.doCall(DefaultListenerBuildOperationDecorator.java:178)
    at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:40)
    at org.gradle.listener.ClosureBackedMethodInvocationDispatch.dispatch(ClosureBackedMethodInvocationDispatch.java:25)
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:42)
    at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:230)
    at org.gradle.internal.event.BroadcastDispatch$SingletonDispatch.dispatch(BroadcastDispatch.java:149)
    at org.gradle.internal.event.AbstractBroadcastDispatch.dispatch(AbstractBroadcastDispatch.java:58)
    at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:324)
    at org.gradle.internal.event.BroadcastDispatch$CompositeDispatch.dispatch(BroadcastDispatch.java:234)
    at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:140)
    at org.gradle.internal.event.ListenerBroadcast.dispatch(ListenerBroadcast.java:37)
    at org.gradle.internal.dispatch.ProxyDispatchAdapter$DispatchingInvocationHandler.invoke(ProxyDispatchAdapter.java:93)
    at com.sun.proxy.$Proxy26.afterEvaluate(Unknown Source)
    at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:187)
    at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate$1.execute(LifecycleProjectEvaluator.java:184)
    at org.gradle.api.internal.project.DefaultProject.stepEvaluationListener(DefaultProject.java:1418)
    at org.gradle.configuration.project.LifecycleProjectEvaluator$NotifyAfterEvaluate.run(LifecycleProjectEvaluator.java:193)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:110)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:68)
    at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:687)
    at org.gradle.api.internal.project.DefaultProject.evaluate(DefaultProject.java:140)
    at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:35)
    at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:62)
    at org.gradle.configuration.DefaultBuildConfigurer.configure(DefaultBuildConfigurer.java:41)
    at org.gradle.initialization.DefaultGradleLauncher$ConfigureBuild.run(DefaultGradleLauncher.java:274)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:300)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:292)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:174)
    at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:90)
    at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
    at org.gradle.initialization.DefaultGradleLauncher.configureBuild(DefaultGradleLauncher.java:182)
    at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:141)
    ... 52 more
    Caused by: org.gradle.internal.component.model.ConfigurationNotFoundException: Project :flow-collector declares a dependency from configuration 'compile' to configuration 'default' which is not declared in the descriptor for project :flow-collector-common.
    at org.gradle.internal.component.model.LocalComponentDependencyMetadata.selectConfigurations(LocalComponentDependencyMetadata.java:123)
    at org.gradle.internal.component.local.model.DslOriginDependencyMetadataWrapper.selectConfigurations(DslOriginDependencyMetadataWrapper.java:60)
    at org.gradle.api.internal.artifacts.ivyservice.resolveengine.graph.builder.EdgeState.calculateTargetConfigurations(EdgeState.java:166)
    ... 128 more

KAR generation does properly package dependencies with classifiers.

It would seem that maven dependencies with classifiers are not properly picked up and packaged in the output KAR file. I have the following dependencies that are not being packaged.

dependencies {
implementation 'com.github.jnr:jffi:1.2.18:complete'
implementation 'com.github.jnr:jffi:1.2.18:native'
}

Kar layout issue?

I am not entirely sure about this issue, but while having a problem installing a KAR generated with this plugin (thanks for developing it, by the way!), I encountered the following fact.

If you look at https://karaf.apache.org/manual/latest/users-guide/kar.html it suggests that the KAR follows Maven repo structure, for example

    48049  2013-12-06 10:52   repository/javax/portlet/portlet-api/2.0/portlet-api-2.0.jar

Where groupId java.portlet is resolved to `javax/portlet'. Now, when I look into the exploded kar, I see this:

drwxr-xr-x   3 yrashk  staff   102 21 Mar 05:56 javax.servlet

Is there anything I am missing?

P.S. The problem I am having with this KAR deployment is that it complains about not being able to install my application's artifacts (can't locate them). So I figured if they are not in the expected format of [com/project]/[artifactId]/[version] then there's no surprise it can't find them.

What if we replaced dots with slashes here

https://github.com/lburgazzoli/gradle-karaf-plugin/blob/master/src/main/groovy/com/github/lburgazzoli/gradle/plugin/karaf/kar/KarafKarTask.groovy#L64

and here

https://github.com/lburgazzoli/gradle-karaf-plugin/blob/master/src/main/groovy/com/github/lburgazzoli/gradle/plugin/karaf/kar/KarafKarTask.groovy#L75

Do you think that'd be appropriate? Or am I missing something indeed?

gradle multi-project build fails to resolve local dependency

Scenario

We have two modules using karaf plugin.

Module A has a compile time dependency on Module B.

In a multi project build scenario,

  • What went wrong:
    A problem occurred configuring project ':,module-a'.

Could not resolve all dependencies for configuration ':module-a:compile'.
Module version xxx:module-a:17.6.0-rel.17-SNAPSHOT, configuration 'compile' declares a dependency on configuration 'default' which is not declared in the module descriptor for xxx:module-b:17.6.0-rel.3-SNAPSHOT

Individually both the modules compile fine. Just that the multi project build fails with the above error.

Allow customization of kar file name

In the java plugin, I can set jar.archiveName = 'foo.jar' to override the default artifact name. I'd like to be able to do the same with kar files. Right now, I just have a Copy task that renames the file:

task renameKar(type: Copy) {
    from "build/karaf/kar/${project.name}-${project.version}.kar"
    into "build/karaf/kar/"
    rename "${project.name}-${project.version}.kar", "${project.name}.kar"
}

Unable to generate <bundle /> in features.xml with dependency flag

Hi,

I've been migrating a project over to Gradle and attempting to use your plugin to generate the features.xml but I seem to get a lot of "extra" information in there than I really need and I can't seem to add any bundles as dependencies.

Here is my configuration:

karaf {
    features {
        name = "${artifactName}-features-${version}"
        xsdVersion = '1.0.0'
        version = "${version}"

        includeProject = false

        repository("mvn:org.apache.camel.karaf/apache-camel/${camelVersion}/xml/features")

        feature {
            name = "${artifactName}"
            description = "${artifactDescription}"
            version = "${version}"

            configuration 'fuseXml'

            feature('camel-blueprint') {
                version = camelVersion
            }
            feature('camel-cxf') {
                version = camelVersion
            }
            feature('camel-mybatis') {
                version = camelVersion
            }
            feature('camel-ftp') {
                version = camelVersion
            }
            feature('camel-jasypt') {
                version = camelVersion
            }

            bundle("mvn:org.apache.servicemix.bundles/org.apache.servicemix.bundles.spring-jdbc/${springVersion}") {
                dependency = true
            }
            bundle("mvn:org.mybatis/mybatis-spring/${mybatisVersion}") {
                dependency = true
            }
        }
    }
}

I've attached the actual output and the output that I'd like to achieve, are you able to help or am I attempting something that is currently not supported?

Thanks,
Dan

features.xml - This is what I get after generation
features.xml - This is what I would like to generate

ServiceMix (Karaf) Custom Distribution

Hello,

I'm looking for an easy to create a custom distribution of Apache ServiceMix preconfigured with my application packaged as a KAR. I have a Gradle multi project where the root has a configuration to download and expand a clean copy of Apache ServiceMix. Each subproject inherits from a common.gradle which uses 'org.dm.bundle' to generate OSGi bundles from each subproject. The idea is that each subproject would generate an OSGi bundle along with it's transitive dependencies (defined in the dependency block and wrapped with bnd), and layed out in maven repository format. Then I'd like to use this plug-in to generate a features xml and ultimately package the KAR file for deployment in the custom distribution.

I'm not sure if I'm in the right place to be asking this but any pointers/help to solve the above would be greatly appreciated. If the answer is I simply need to write something myself I will.

Thanks,

-Charlie

whitelisting bundles in feature

Maybe its just my gradle noob status but shouldn't it be really simple to only pick a handful of subprojects to be included in your feature.xml.
Right now, i need to maintain a quite large blacklist of bundles like so:

bundle(':bundleA') { include = false }
bundle(':bundleB') { include = false }
..
See, in my case the blacklist is quite large where the whitelist (read below) would be small. Also there is the danger that bundles get included at some point without changing the gradle build file. This would not happen if i could hand-pick the sub projects.

But i would like to do that:

bundle(':*') { include = false }
bundle(':bundleC') { include = true }

Even the that first "*" line might rather not be needed if there is a way to say "addSubprojects=false".
Again, probably done via gradle magic, but i don't know how yet. Would be cool to have it in the plugin. ;)

Cannot use project() objects in feature configurations

Here's what I'm trying to do. I want to make a configuration that corresponds to all my gradle projects that are being combined into a kar file. I'm not very familiar with the "Gradle way" of doing things, so what I tried was doing what I've done with the compile configuration:

configurations {
  foo
}

dependencies {
  foo project(':module1'), project(':module2'), ...
}

karaf {
  features {
    // ...
    feature {
      name = 'foo'
      description = 'Foo project'
      version = '1.0.0'
      configurations = [project.configurations.foo]
    }
  }
}

When I try to run gradle clean build, I get an error saying that no file could be found named module1/build/libs/module1-1.0.0.jar which is true. This is because it's trying to resolve this file before the jar task has been run as far as I can tell.

I'm not sure if I'm just trying to use this wrong, so this could be an invalid bug. What I'm currently doing is using maven coordinates instead and running "gradle clean install build" instead of just "gradle build" which to me looks like an ugly workaround that I want to eliminate if possible.

Incorrect feature tag element.

When creating the kar file an extra <feature> element is getting generated in the xml file:

<feature name="jackson" version="2.6.2" description="Jackson JSON Libraries">
    <feature>jackson</feature>
    <bundle>mvn:com.fasterxml.jackson.core/jackson-core/2.6.2</bundle>
    <bundle>mvn:com.fasterxml.jackson.core/jackson-annotations/2.6.2</bundle>
    <bundle>mvn:com.fasterxml.jackson.core/jackson-databind/2.6.2</bundle>
    <bundle>mvn:com.fasterxml.jackson.module/jackson-module-jaxb-annotations/2.6.2</bundle>
    <bundle>mvn:joda-time/joda-time/2.1</bundle>
    <bundle>mvn:com.fasterxml.jackson.datatype/jackson-datatype-joda/2.6.2</bundle>
  </feature>

However the maven plugin generates only this:

<feature name="jackson" version="2.6.2" description="Jackson JSON Libraries">
        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-core/2.6.2</bundle>
        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-annotations/2.6.2</bundle>
        <bundle dependency="true">mvn:com.fasterxml.jackson.core/jackson-databind/2.6.2</bundle>
        <bundle dependency="true">mvn:com.fasterxml.jackson.module/jackson-module-jaxb-annotations/2.6.2</bundle>
        <bundle dependency="true">mvn:joda-time/joda-time/2.1</bundle>
        <bundle dependency="true">mvn:com.fasterxml.jackson.datatype/jackson-datatype-joda/2.6.2</bundle>
    </feature>

Please see that there is no <feature> element for the second xml.

When deploying the kar file (karaf 3.0.4) the following stack appears:

org.apache.karaf.features.core - 3.0.4 | Installing feature jackson 2.6.2
09:02:41,057 | ERROR | raf-3.0.4/deploy | fileinstall                      | 7 - org.apache.felix.fileinstall - 3.5.0 | In main loop, we have serious trouble
java.lang.StackOverflowError
        at org.apache.log4j.helpers.AbsoluteTimeDateFormat.format(AbsoluteTimeDateFormat.java:85)[4:org.ops4j.pax.logging.pax-logging-service:1.8.3]
        at java.text.DateFormat.format(DateFormat.java:345)[:1.8.0_66]
        at org.apache.log4j.helpers.PatternParser$DatePatternConverter.convert(PatternParser.java:443)[4:org.ops4j.pax.logging.pax-logging-service:1.8.3]
        at org.apache.log4j.helpers.PatternConverter.format(PatternConverter.java:65)[4:org.ops4j.pax.logging.pax-logging-service:1.8.3]
        at org.apache.log4j.PatternLayout.format(PatternLayout.java:506)[4:org.ops4j.pax.logging.pax-logging-service:1.8.3]
        at org.apache.log4j.WriterAppender.subAppend(WriterAppender.java:310)[4:org.ops4j.pax.logging.pax-logging-service:1.8.3]
        at org.apache.log4j.RollingFileAppender.subAppend(RollingFileAppender.java:276)[4:org.ops4j.pax.logging.pax-logging-service:1.8.3]
        at org.apache.log4j.WriterAppender.append(WriterAppender.java:162)[4:org.ops4j.pax.logging.pax-logging-service:1.8.3]

Seems that for some reason the dependency is not getting resolved.

Feature task does not include own bundle

I have a project that I am trying to create a feature and KAR for. When I run the build, it generates the feature and the KAR, but the feature does not include the bundle for the project it is in, and as a result, the KAR also does not include the bundle. I am using version 0.0.21, built locally.

I understand things are still under development, but I am more asking to make sure I did not do anything incorrectly.

karaf {
    features {
        feature {
            name = project.name
            description = 'Our ' + project.name + ' Feature'
        }
    }
    kar {
        enabled = true
    }
}

What is the proper way to publish features file to a maven repository and others?

Hi,

I'm building feature that I would like to publish to a maven repository, maybe alongside the kar archive.
How can I publish it with the maven-publish plugin.

Ideally this (or something similar) should be enough:

publishing {
    publications {
        jcrFeaturePublication(MavenPublication) {
            groupId 'com.netdava.karaf'
            artifactId 'jcr-features'
            artifact generateFeatures
        }
    }
}

However, it currently fails because:

Error:Cannot convert the provided notation to an object of type MavenArtifact: task ':jcr-features:generateFeatures'.
The following types/formats are supported:
  - Instances of MavenArtifact.
  - Instances of AbstractArchiveTask, for example jar.
  - Instances of PublishArtifact
  - Maps containing a 'source' entry, for example [source: '/path/to/file', extension: 'zip'].
  - Anything that can be converted to a file, as per Project.file()

Add support for using a pre-existing feature.xml

There are two facets to this:

  1. Include or merge together (if possible) src/main/feature/feature.xml (configurable location?) with the inline feature XML slurper thing into a kar file.
  2. Allow the feature.xml file to be interpolated with gradle properties like how karaf-maven-plugin works. The standard interpolation was ${foo} and @foo@.

Add regular exception / ant style pattern matching support for bundles

Hello,

I'm using the plugin to build a feature for Apache Oak and Apache Sling. Some bundles from some features need to be marked as dependencies.

It would be easier if we could do that using an regular expression or event better ant style pattern matching (ant patterns are much simpler).

For

    jackrabbitSling "commons-codec:commons-codec:1.10"
    jackrabbitSling "commons-collections:commons-collections:3.2.2"
    jackrabbitSling "commons-fileupload:commons-fileupload:1.3.2"
    jackrabbitSling "commons-io:commons-io:2.5"
    jackrabbitSling "commons-lang:commons-lang:2.6"

It would be nice to have:

            bundle('commons-*') {
                attribute 'dependency', 'true'
            }

[1] https://ant.apache.org/manual/dirtasks.html
[2] https://github.com/azagniotov/ant-style-path-matcher

Add support to upload features.xml to maven repository

Hello,
First, Great job!!! with this plugin. Saved so much of time and learnt things can be made better than what I have.

On the request, is there a way to upload the generated features xml on to a mvn respository similar to karaf-maven plugin?

~Dixie.

resolve dependencies from gradle m2 cache not maven local cache

Hi, we are trying to use your plugin with thirdparty dependencies resolving from our local gradle cache and not the maven local cache. We use artifactory resolver to populate the gradle cache and not mavenLocal.

Can this be configured in your karaf plugin ? How can we achieve this by setting the resolution dependency location to the gradle cache which contains all of our dependencies.

Gradle error trying to resolve thirdparty dependency from local maven cache:

FAILURE: Build failed with an exception.

  • What went wrong:
    Could not resolve all dependencies for configuration ':runtime'.

Could not find org.apache.sshd:sshd-core:1.3.0.
Searched in the following locations:
file:/home/vagrant/.m2/repository/org/apache/sshd/sshd-core/1.3.0/sshd-core-1.3.0.pom
file:/home/vagrant/.m2/repository/org/apache/sshd/sshd-core/1.3.0/sshd-core-1.3.0.jar

Can we configure the plugin to look at the gradle cache to resolve these dependencies to resolve this issue ?

Thanks

copy config file in kar with wrong path

Hi ,
when I try to use your example for config file :
// Add configFile entry and copy a local file to the kar repository
configFile {
filename = "/etc/hazelcast-clustered.xml"
file = file("etc/hazelcast-clustered-defaults.xml")
uri = "mvn:org.apache.karaf.cellar/apache-karaf-cellar/${project.version}/xml/hazelcast-clustered"
}

There is an issue when the config file is copied to kar, it creates the directory : repository/mvn:org/apache/karaf/cellar/apache-karaf-cellar/0.0.1 which this should be repository/org/apache/karaf/cellar/apache-karaf-cellar/0.0.1

Can't override configurations in karaf/features/feature/configurations

I get the error:

Cannot set the property 'configurations' because the backing field is final.

Snippet:

karaf {
    features {
        xsdVersion = '1.2.1'
        version = '4.0.0'
        description = 'Karaf archive of 3rd party dependencies for Synergy'

        repository "mvn:org.apache.karaf.cellar/apache-karaf-cellar/${cellar_version}/xml/features"
        repository "mvn:org.apache.karaf.features/enterprise/${karaf_version}/xml/features"
        repository "mvn:org.apache.karaf.features/enterprise/${karaf_version}/xml/features"
        repository "mvn:org.ops4j.pax.web/pax-web-features/3.1.0/xml/features"
        repository "mvn:org.apache.karaf.features/spring/${karaf_version}/xml/features"

        feature {
            name = 'jackson'
            description = 'Jackson JSON Libraries'
            version = "${jackson_version}"
            configurations = [
                project.configurations.jackson
            ]
        }
}

Though if the way of doing this has changed, please let me know. I haven't upgraded my copy of this plugin in a while, so I lost track of recent developments.

Incorrect feature.xml file inside KAR file

The following configuration generates an incorrect feature.xml file:

plugins {
    id 'java'
    id 'groovy'
    id 'maven'
    id 'com.github.lburgazzoli.karaf' version '0.0.11'
}

karaf {

    features {
        xsdVersion = '1.2.0'

        repository "mvn:org.apache.karaf.cellar/apache-karaf-cellar/3.0.0/xml/features"
        repository "mvn:org.apache.karaf.features/enterprise/3.0.4/xml/features"
        repository "mvn:org.apache.karaf.features/enterprise/3.0.4/xml/features"
        repository "mvn:org.ops4j.pax.web/pax-web-features/3.1.0/xml/features"
        repository "mvn:org.apache.karaf.features/spring/3.0.4/xml/features"

        feature {
            feature name = "jackson"
            description = "Jackson JSON Libraries"
            version = "2.6.2"
            bundle "mvn:com.fasterxml.jackson.core/jackson-core/2.6.2"
            bundle "mvn:com.fasterxml.jackson.core/jackson-annotations/2.6.2"
            bundle "mvn:com.fasterxml.jackson.core/jackson-databind/2.6.2"
            bundle "mvn:com.fasterxml.jackson.module/jackson-module-jaxb-annotations/2.6.2"
            bundle "mvn:joda-time/joda-time/2.1"
            bundle "mvn:com.fasterxml.jackson.datatype/jackson-datatype-joda/2.6.2"
        }
    }

    kar {
    }
}

The only content of the feature.xml file is the full path to it:

/Users/magonzal/workspace/project-synergy/synergy-dependencies/build/karaf/feautures/synergy-dependencies-3.0.0.RELEASE.xml

Support for prerequisite features

This is something we should probably consider supporting:

<features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="app-2.0.0">
    <feature name="external-libs" version="2.0.0" description="External libs">
        <details>External dependencies</details>
        <feature prerequisite="true">wrap</feature>
        <bundle start-level="80">wrap:mvn:net.sf.ehcache/ehcache-core/2.6.11$Bundle-SymbolicName=ehcache-core&amp;Bundle-Version=2.6.11</bundle>
    </feature>
</features>

It got documented in 4.0.5 https://github.com/apache/karaf/blob/6a9ca438ccf284cd5a36b2e51768172d21290110/manual/src/main/asciidoc/developer-guide/creating-bundles.adoc

apache/karaf@6a9ca43

Thoughts?

Support for excluding specific bundles

Occasionally I will depend on two libraries that through their transitive dependencies will include bundles with conflicting exports. In the old gradle karaf features plugin there was the ability to define a bundle with 'include=false' in order to not include the bundle, which I would use for the transitive dependency that I did not want included in the feature. Is there a way to do the same in this plugin?

bundle('someBundleName') { include = false }

project dependency does not have a version

I have bnd project consisting of 3 sub-projects.
one sub project is the karaf "feature" project, the two other projects are my provider bundle and application bundle.

the build.gradle of the "feature" project contains the following dependencies:

dependencies {
iot project(':com.iotapp.provider')
iot project(':com.iotapp.application')
mqtt 'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.1'
}

karaf {
features {
name = "${project.name}-${version}"
xsdVersion = '1.3.0'
outputFile = file("${project.buildDir}/karaf/features/${project.name}-feature.xml")
includeProject = false;

feature {
	name        = 'iotapp'
	description = 'iot message processing'
	
	configurations 'mqtt', 'iot'
            feature 'scr'
   }

}
}

When I run the gradle generateFeatures it generates the following feature xml:

scr mvn:org.eclipse.paho/org.eclipse.paho.client.mqttv3/1.1.1 mvn:com.iot/com.iot.provider/unspecified mvn:com.iot/com.iot.application/unspecified

as you can see in the last two bundles no version is added.

Different versions of the same artifact get conflated

I have a dependency on com.google.guava:guava:20.0 and some other dependencies have a transitive dependency on com.google.guava:guava:19.0. When I generate a feature file, I only get this:

<bundle>mvn:com.google.guava/guava/20.0</bundle>

Is there any way we can support multiple versions of the artifact to satisfy the dependencies? After all, isn't OSGi supposed to be a solution to this problem in the first place :)

WAR support

In my OSGi application, I have mostly regular bundles (JARs) and just one war. Right now, the plugin happily puts the JAR into the KAR, however, this is not what I want it to do. I either have to leave the dependency out of the feature file and then install it manually, but I'd rather automate this.

I think the issue is twofold:

  1. Feature needs to be generated properly, here's an example of using a war file:
 <feature name="activemq-web-console" version="5.4.2">
        <bundle>war:mvn:org.apache.activemq/activemq-web-console/5.4.2/war?Webapp-Context=activemq-web-console</bundle>
    </feature>

(Found it by googling at http://karaf.922171.n3.nabble.com/Installing-a-war-file-in-a-feature-td2747919.html)

  1. At least in my case, building a proper war requires invoking the "war" task (instead of "jar"). I am still learning this plugin's implementation to see how feasible this would be.

Thoughts?

Auto generate feature capabilitiy

Hello,

I have a bundle with Require-Capability: headers requiring multiple "osgi.service;" services with effective:=active.

When I tried the capability option as below

            capability('osgi.service') {
                effective = 'active'
                extra = 'objectClass=io.dartle.apis.service1'
            }
            capability('osgi.service') {
                effective = 'active'
                extra = 'objectClass=io.dartle.apis.service2'
            }

Note: both are of osgi.service kinds

I expected the generated feature xml to have all the capabilities, but I see only the last entry viz. io.dartle.apis.service2. I think It is overwritten.

Need advice on the following:

  1. How to add multiple service capability requirements?
  2. Or is there a way to auto generate capabilities when a JAR is being validated to be a Bundle?

~Dixie.

GenerateKar task not working with some dependencies

The following gradle configuration is failing:

plugins {
    id 'com.github.lburgazzoli.karaf' version '0.0.13'
}

configurations {
    commons_io
    jpasskit
}

dependencies {
    commons_io "commons-io:commons-io:2.4"

    jpasskit "de.brendamour:jpasskit:0.0.8",
            "com.google.guava:guava:19.0",
            "org.bouncycastle:bcprov-jdk15on:1.52",
            "org.bouncycastle:bcpkix-jdk15on:1.52"
}

karaf {

    features {
        xsdVersion = '1.2.0'
        version = '4.0.0'
        description = 'Karaf archive of 3rd party dependencies for Synergy'

        repository "mvn:org.apache.karaf.cellar/apache-karaf-cellar/3.0.0/xml/features"
        repository "mvn:org.apache.karaf.features/enterprise/3.0.4/xml/features"
        repository "mvn:org.apache.karaf.features/enterprise/3.0.4/xml/features"
        repository "mvn:org.ops4j.pax.web/pax-web-features/3.1.0/xml/features"
        repository "mvn:org.apache.karaf.features/spring/3.0.4/xml/features"

        feature {
            feature name = 'commons-io'
            description = 'Apache Commons IO'
            version = "2.4"
            configurations = [
                    project.configurations.commons_io
            ]
        }

        feature {
            feature name = 'jpasskit'
            description = 'Java Library for Apple PassBook Web Service API'
            version = "0.0.8"
            configurations = [
                    project.configurations.jpasskit
            ]
        }
    }
}

The kar file is created when if I add the dependencies separately. However if I combine both of them I get the following stacktrace

* Exception is:
org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':coupons-dao:generateKar'.
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)
    at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35)
    at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:64)
    at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:58)
    at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:52)
    at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:53)
    at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:43)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:203)
    at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter$EventFiringTaskWorker.execute(DefaultTaskGraphExecuter.java:185)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.processTask(AbstractTaskPlanExecutor.java:66)
    at org.gradle.execution.taskgraph.AbstractTaskPlanExecutor$TaskExecutorWorker.run(AbstractTaskPlanExecutor.java:50)
    at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:54)
    at org.gradle.internal.concurrent.StoppableExecutorImpl$1.run(StoppableExecutorImpl.java:40)
Caused by: org.gradle.api.UncheckedIOException: java.nio.file.FileAlreadyExistsException: /Users/magonzal/VirtualBox VMs/servicemixvm/shared_workspace/project-synergy/coupons-dao/build/karaf/kar/repository/commons-io/commons-io/2.4/commons-io-2.4.jar
    at org.gradle.internal.UncheckedException.throwAsUncheckedException(UncheckedException.java:43)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:78)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:227)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:220)
    at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:209)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:585)
    at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:568)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80)
    at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)
    ... 14 more
Caused by: java.nio.file.FileAlreadyExistsException: /Users/magonzal/VirtualBox VMs/servicemixvm/shared_workspace/project-synergy/coupons-dao/build/karaf/kar/repository/commons-io/commons-io/2.4/commons-io-2.4.jar
    at com.github.lburgazzoli.gradle.plugin.karaf.kar.KarafKarTask.copy(KarafKarTask.groovy:79)
    at com.github.lburgazzoli.gradle.plugin.karaf.kar.KarafKarTask$_copy_closure1$_closure2.doCall(KarafKarTask.groovy:54)
    at com.github.lburgazzoli.gradle.plugin.karaf.kar.KarafKarTask$_copy_closure1.doCall(KarafKarTask.groovy:50)
    at com.github.lburgazzoli.gradle.plugin.karaf.kar.KarafKarTask.copy(KarafKarTask.groovy:49)
    at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:75)
    ... 21 more

Add support for transitive dependency inclusion during generateKar task

maven-karaf-pluggin supports including transitive dependencies during the creation of the kar file:


        <pluginManagement>
            <plugins>
                <plugin>
                    <groupId>org.apache.karaf.tooling</groupId>
                    <artifactId>karaf-maven-plugin</artifactId>
                    <version>${karaf.version}</version>
                    <extensions>true</extensions>
                </plugin>
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.apache.karaf.tooling</groupId>
                <artifactId>karaf-maven-plugin</artifactId>
                <configuration>
                    <startLevel>80</startLevel>
                    <aggregateFeatures>true</aggregateFeatures>
                    <resolver>(obr)</resolver>
                    <checkDependencyChange>true</checkDependencyChange>
                    <failOnDependencyChange>false</failOnDependencyChange>
                    <logDependencyChanges>true</logDependencyChanges>
                    <overwriteChangedDependencies>true</overwriteChangedDependencies>
                    <includeTransitiveDependency>false</includeTransitiveDependency>
                    <finalName>${project.artifactId}</finalName>
                </configuration>
            </plugin>
        </plugins>

Excluding all transitive dependencies in the dependency block seems just to be a workaround.

During a composite build, the parent jar is copied in place of all composite build jars in the generated kar

When generating a kar from a gradle composite build, the composite build project jar is copied in place of all of the included includeBuild('projectPath') jar files.

To reproduce the problem, please see the attached zip file.

Extract the zip file and run gradlew jar generateFeatures generateKar from the karafPluginCompositeBug directory.

Now extract ProjectA.jar from the exploded kar directory:
"karafPluginCompositeBug/build/karaf/kar/exploded/repository/com/github/projecta/ProjectA/1.0/ProjectA-1.0.jar"

You will notice that the plugin copied the parent jar file (karafPluginCompositeBug-1.0.jar) but with the name ProjectA-1.0.jar which is the bug. It should contain the ProjectA.class file but instead contains Bug.class.

If you examine the ProjectA-1.0.jar file in "ProjectA/build/libs/ProjectA-1.0.jar", you will notice it contains the proper ProjectA.class file.

Thank you for all your great work on this project!

karafPluginCompositeBug.zip

Differently classified dependencies get conflated

I have these dependencies:

    compile "ca.uhn.hapi.fhir:hapi-fhir-testpage-overlay:2.0:classes"
    runtime "ca.uhn.hapi.fhir:hapi-fhir-testpage-overlay:2.0@war"

However, in features they get conflated into one:

wrap:mvn:ca.uhn.hapi.fhir/hapi-fhir-testpage-overlay/2.0

Is there anything that can be done about this?

Unable to use install="auto"

Karaf allows for such syntax:
<feature name="my-feature" version="0.0.1" install="auto">

Unfortunately, when I try:

feature {
  name = 'my-feature'
  install = 'auto'
}

I got:
> Could not set unknown property 'install'

Adding bundle instructions in the features

I have a transitive dependency that results in a bundle line like this:

    <bundle>wrap:mvn:org.bitcoinj/bitcoinj-core/0.13.6</bundle>

However, since it is not an OSGi package, and I [desperately] need to attach a fragment to it, I need to assign a symbolic name to it, like this:

    <bundle>wrap:mvn:org.bitcoinj/bitcoinj-core/0.13.6$Bundle-SymbolicName=bitcoinj</bundle>

However, I can't quite figure out how this should be done with this plugin.

I tried different variations of this but none worked:

bundle('wrap:mvn:org.bitcoinj/bitcoinj-core/0.13.6') {
    it.instruction "Bundle-SymbolicName", "bitcoinj"
}

Any advice? Thanks!

Support for Capabilities

<feature name="aries-blueprint" description="Aries Blueprint" version="4.0.1">
    <feature prerequisite="false" dependency="false">aries-proxy</feature>
    <bundle start-level="20">
        mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.api/1.0.1
    </bundle>
    <bundle start-level="20">
        mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.cm/1.0.6
    </bundle>
    <bundle start-level="20">
        mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.core.compatibility/1.0.0
    </bundle>
    <bundle start-level="20">
        mvn:org.apache.aries.blueprint/org.apache.aries.blueprint.core/1.4.3
    </bundle>
    <conditional>
        <condition>bundle</condition>
        <bundle start-level="30">
            mvn:org.apache.karaf.bundle/org.apache.karaf.bundle.blueprintstate/4.0.1
        </bundle>
    </conditional>
    <capability>
        osgi.service;effective:=active;objectClass=org.apache.aries.blueprint.services.ParserService, osgi.extender;
        osgi.extender="osgi.blueprint";uses:="org.osgi.service.blueprint.container,org.osgi.service.blueprint.reflect";version:Version="1.0"
    </capability>
</feature>

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.