You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@wicket.apache.org by ad...@apache.org on 2022/10/08 15:12:08 UTC

[wicket] branch wicket-9.x updated: WICKET-6999 Update bundle plugin to support slf4j [1.7,3)

This is an automated email from the ASF dual-hosted git repository.

adelbene pushed a commit to branch wicket-9.x
in repository https://gitbox.apache.org/repos/asf/wicket.git


The following commit(s) were added to refs/heads/wicket-9.x by this push:
     new 227b94027c WICKET-6999 Update bundle plugin to support slf4j [1.7,3)
227b94027c is described below

commit 227b94027cf129239bedbfeeddf5f0f5c2f92380
Author: Matt Pavlovich <ma...@hyte.io>
AuthorDate: Thu Sep 29 11:31:34 2022 -0500

    WICKET-6999 Update bundle plugin to support slf4j [1.7,3)
---
 pom.xml                                            |  25 +++--
 wicket-auth-roles/pom.xml                          |   5 +-
 wicket-bean-validation/pom.xml                     |   4 +
 wicket-cdi/pom.xml                                 |   5 +-
 wicket-core/pom.xml                                | 112 ++++++++++++++++++++-
 wicket-devutils/pom.xml                            |   5 +-
 wicket-extensions/pom.xml                          |   5 +-
 wicket-guice/pom.xml                               |   5 +-
 wicket-ioc/pom.xml                                 |   5 +-
 wicket-jmx/pom.xml                                 |   5 +-
 .../wicket-native-websocket-core/pom.xml           |   5 +-
 .../wicket-native-websocket-javax/pom.xml          |   4 +
 wicket-objectsizeof-agent/pom.xml                  |   5 +-
 wicket-request/pom.xml                             |   2 +
 wicket-spring/pom.xml                              |   2 +
 wicket-user-guide/src/main/asciidoc/karaf.adoc     |   3 +
 .../src/main/asciidoc/karaf/karaf_1.adoc           |  75 ++++++++++++++
 wicket-user-guide/src/main/asciidoc/single.adoc    |   9 ++
 wicket-util/pom.xml                                |   2 +
 wicket-velocity/pom.xml                            |   2 +
 wicket/pom.xml                                     |  43 ++++++++
 wicket/src/main/filtered-resources/features.xml    |  25 +++++
 22 files changed, 335 insertions(+), 18 deletions(-)

diff --git a/pom.xml b/pom.xml
index 114e17485e..ef6100bb82 100644
--- a/pom.xml
+++ b/pom.xml
@@ -177,9 +177,10 @@
 		<velocity-engine-core.version>2.3</velocity-engine-core.version>
 
 		<!-- Maven plugins -->
+		<build-helper-maven-plugin.version>3.3.0</build-helper-maven-plugin.version>
 		<japicmp-maven-plugin.version>0.15.5</japicmp-maven-plugin.version>
 		<maven-archetype-plugin.version>3.2.0</maven-archetype-plugin.version>
-		<maven-bundle-plugin.version>5.1.3</maven-bundle-plugin.version>
+		<maven-bundle-plugin.version>5.1.8</maven-bundle-plugin.version>
 		<maven-clean-plugin.version>3.1.0</maven-clean-plugin.version>
 		<maven-compiler-plugin.version>3.8.1</maven-compiler-plugin.version>
 		<maven-deploy-plugin.version>2.8.2</maven-deploy-plugin.version>
@@ -200,6 +201,9 @@
 		<maven-war-plugin.version>3.3.1</maven-war-plugin.version>
 		<yuicompressor-maven-plugin.version>1.5.1</yuicompressor-maven-plugin.version>
 
+		<osgi.dynamicimport.package></osgi.dynamicimport.package>
+		<osgi.export.package>*</osgi.export.package>
+		<osgi.import.package>!java,!kotlin,*</osgi.import.package>
 	</properties>
 
 	<dependencyManagement>
@@ -891,18 +895,18 @@
 					<extensions>true</extensions>
 					<executions>
 						<execution>
-							<id>bundle-manifest</id>
-							<phase>process-classes</phase>
+							<id>default-bundle</id>
+							<phase>package</phase>
 							<goals>
-								<goal>manifest</goal>
+								<goal>bundle</goal>
 							</goals>
 							<configuration>
 								<instructions>
-									<Export-Package>*</Export-Package>
-									<Import-Package>org.apache.wicket*,
-										org.junit.jupiter*</Import-Package>
-									<DynamicImport-Package>*</DynamicImport-Package>
+									<Export-Package>${osgi.export.package}</Export-Package>
+									<Import-Package>${osgi.import.package}</Import-Package>
+									<DynamicImport-Package>${osgi.dynamicimport.package}</DynamicImport-Package>
 									<_nouses>true</_nouses>
+									<_noee>true</_noee>
 								</instructions>
 							</configuration>
 						</execution>
@@ -1171,6 +1175,11 @@
 						<warName>${project.artifactId}</warName>
 					</configuration>
 				</plugin>
+				<plugin>
+					<groupId>org.codehaus.mojo</groupId>
+					<artifactId>build-helper-maven-plugin</artifactId>
+					<version>${build-helper-maven-plugin.version}</version>
+				</plugin>
 				<plugin>
 					<groupId>org.eclipse.jetty</groupId>
 					<artifactId>jetty-maven-plugin</artifactId>
diff --git a/wicket-auth-roles/pom.xml b/wicket-auth-roles/pom.xml
index 85d838d2d8..0cc094182b 100644
--- a/wicket-auth-roles/pom.xml
+++ b/wicket-auth-roles/pom.xml
@@ -30,7 +30,10 @@
 		Wicket Authorization Integration Based on roles, metadata and
 		annotations.
 	</description>
-
+	<properties>
+		<osgi.export.package>org.apache.wicket.authroles*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+	</properties>
 	<dependencies>
 		<dependency>
 			<groupId>org.apache.wicket</groupId>
diff --git a/wicket-bean-validation/pom.xml b/wicket-bean-validation/pom.xml
index 83ee143bda..c88111dd68 100644
--- a/wicket-bean-validation/pom.xml
+++ b/wicket-bean-validation/pom.xml
@@ -26,6 +26,10 @@
 	<artifactId>wicket-bean-validation</artifactId>
 	<packaging>bundle</packaging>
 	<name>Wicket Bean Validation</name>
+	<properties>
+		<osgi.export.package>org.apache.wicket.bean.validation*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+	</properties>
 
 	<dependencies>
 		<dependency>
diff --git a/wicket-cdi/pom.xml b/wicket-cdi/pom.xml
index 3665076401..2aced4a0ff 100644
--- a/wicket-cdi/pom.xml
+++ b/wicket-cdi/pom.xml
@@ -32,7 +32,10 @@
 		Also enables propagation of conversations between wicket artifacts such as pages
 		and resources.
 	</description>
-
+	<properties>
+		<osgi.export.package>org.apache.wicket.cdi*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+	</properties>
 	<dependencies>
 		<dependency>
 			<groupId>jakarta.annotation</groupId>
diff --git a/wicket-core/pom.xml b/wicket-core/pom.xml
index 710fd95305..4ae80132a6 100644
--- a/wicket-core/pom.xml
+++ b/wicket-core/pom.xml
@@ -35,7 +35,117 @@
 		component model backed by POJO data beans that can easily be 
 		persisted using your favorite technology.
 	</description>
-
+        <properties>
+                <osgi.export.package>
+org.apache.wicket;-noimport:=true,
+org.apache.wicket.ajax;-noimport:=true,
+org.apache.wicket.ajax.attributes;-noimport:=true,
+org.apache.wicket.ajax.form;-noimport:=true,
+org.apache.wicket.ajax.json;-noimport:=true,
+org.apache.wicket.ajax.markup.html;-noimport:=true,
+org.apache.wicket.ajax.markup.html.form;-noimport:=true,
+org.apache.wicket.ajax.markup.html.navigation.paging;-noimport:=true,
+org.apache.wicket.application;-noimport:=true,
+org.apache.wicket.authentication;-noimport:=true,
+org.apache.wicket.authentication.strategy;-noimport:=true,
+org.apache.wicket.authorization;-noimport:=true,
+org.apache.wicket.authorization.strategies;-noimport:=true,
+org.apache.wicket.authorization.strategies.action;-noimport:=true,
+org.apache.wicket.authorization.strategies.page;-noimport:=true,
+org.apache.wicket.behavior;-noimport:=true,
+org.apache.wicket.coep;-noimport:=true,
+org.apache.wicket.coop;-noimport:=true,
+org.apache.wicket.core.random;-noimport:=true,
+org.apache.wicket.core.request;-noimport:=true,
+org.apache.wicket.core.request.handler;-noimport:=true,
+org.apache.wicket.core.request.handler.logger;-noimport:=true,
+org.apache.wicket.core.request.mapper;-noimport:=true,
+org.apache.wicket.core.util.crypt;-noimport:=true,
+org.apache.wicket.core.util.file;-noimport:=true,
+org.apache.wicket.core.util.lang;-noimport:=true,
+org.apache.wicket.core.util.objects.checker;-noimport:=true,
+org.apache.wicket.core.util.resource;-noimport:=true,
+org.apache.wicket.core.util.resource.locator;-noimport:=true,
+org.apache.wicket.core.util.resource.locator.caching;-noimport:=true,
+org.apache.wicket.core.util.string;-noimport:=true,
+org.apache.wicket.core.util.string.interpolator;-noimport:=true,
+org.apache.wicket.core.util.watch;-noimport:=true,
+org.apache.wicket.csp;-noimport:=true,
+org.apache.wicket.css;-noimport:=true,
+org.apache.wicket.event;-noimport:=true,
+org.apache.wicket.feedback;-noimport:=true,
+org.apache.wicket.javascript;-noimport:=true,
+org.apache.wicket.markup;-noimport:=true,
+org.apache.wicket.markup.head;-noimport:=true,
+org.apache.wicket.markup.head.filter;-noimport:=true,
+org.apache.wicket.markup.head.http2;-noimport:=true,
+org.apache.wicket.markup.head.internal;-noimport:=true,
+org.apache.wicket.markup.html;-noimport:=true,
+org.apache.wicket.markup.html.basic;-noimport:=true,
+org.apache.wicket.markup.html.border;-noimport:=true,
+org.apache.wicket.markup.html.debug;-noimport:=true,
+org.apache.wicket.markup.html.form;-noimport:=true,
+org.apache.wicket.markup.html.form.upload;-noimport:=true,
+org.apache.wicket.markup.html.form.validation;-noimport:=true,
+org.apache.wicket.markup.html.image;-noimport:=true,
+org.apache.wicket.markup.html.image.resource;-noimport:=true,
+org.apache.wicket.markup.html.include;-noimport:=true,
+org.apache.wicket.markup.html.internal;-noimport:=true,
+org.apache.wicket.markup.html.link;-noimport:=true,
+org.apache.wicket.markup.html.list;-noimport:=true,
+org.apache.wicket.markup.html.media;-noimport:=true,
+org.apache.wicket.markup.html.media.audio;-noimport:=true,
+org.apache.wicket.markup.html.media.video;-noimport:=true,
+org.apache.wicket.markup.html.navigation.paging;-noimport:=true,
+org.apache.wicket.markup.html.pages;-noimport:=true,
+org.apache.wicket.markup.html.panel;-noimport:=true,
+org.apache.wicket.markup.loader;-noimport:=true,
+org.apache.wicket.markup.parser;-noimport:=true,
+org.apache.wicket.markup.parser.filter;-noimport:=true,
+org.apache.wicket.markup.renderStrategy;-noimport:=true,
+org.apache.wicket.markup.repeater;-noimport:=true,
+org.apache.wicket.markup.repeater.data;-noimport:=true,
+org.apache.wicket.markup.repeater.util;-noimport:=true,
+org.apache.wicket.markup.resolver;-noimport:=true,
+org.apache.wicket.markup.transformer;-noimport:=true,
+org.apache.wicket.mock;-noimport:=true,
+org.apache.wicket.model;-noimport:=true,
+org.apache.wicket.model.util;-noimport:=true,
+org.apache.wicket.page;-noimport:=true,
+org.apache.wicket.pageStore;-noimport:=true,
+org.apache.wicket.pageStore.crypt;-noimport:=true,
+org.apache.wicket.pageStore.disk;-noimport:=true,
+org.apache.wicket.protocol.http;-noimport:=true,
+org.apache.wicket.protocol.http.mock;-noimport:=true,
+org.apache.wicket.protocol.http.request;-noimport:=true,
+org.apache.wicket.protocol.http.servlet;-noimport:=true,
+org.apache.wicket.protocol.https;-noimport:=true,
+org.apache.wicket.request.component;-noimport:=true,
+org.apache.wicket.request.cycle;-noimport:=true,
+org.apache.wicket.request.handler.render;-noimport:=true,
+org.apache.wicket.request.handler.resource;-noimport:=true,
+org.apache.wicket.request.resource;-noimport:=true,
+org.apache.wicket.request.resource.caching;-noimport:=true,
+org.apache.wicket.request.resource.caching.version;-noimport:=true,
+org.apache.wicket.resource;-noimport:=true,
+org.apache.wicket.resource.bundles;-noimport:=true,
+org.apache.wicket.resource.loader;-noimport:=true,
+org.apache.wicket.response;-noimport:=true,
+org.apache.wicket.response.filter;-noimport:=true,
+org.apache.wicket.serialize;-noimport:=true,
+org.apache.wicket.serialize.java;-noimport:=true,
+org.apache.wicket.session;-noimport:=true,
+org.apache.wicket.settings;-noimport:=true,
+org.apache.wicket.util.cookies;-noimport:=true,
+org.apache.wicket.util.image;-noimport:=true,
+org.apache.wicket.util.reference;-noimport:=true,
+org.apache.wicket.util.template;-noimport:=true,
+org.apache.wicket.util.tester;-noimport:=true,
+org.apache.wicket.validation;-noimport:=true,
+org.apache.wicket.validation.validator;-noimport:=true
+ 		</osgi.export.package> 
+                <osgi.import.package>!java*,!kotlin*,!sun.nio.ch,!com.sun.crypto.provider,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+        </properties>
 	<dependencies>
 		<dependency>
 			<groupId>org.hamcrest</groupId>
diff --git a/wicket-devutils/pom.xml b/wicket-devutils/pom.xml
index 0d72eac9f6..c21b8887c3 100644
--- a/wicket-devutils/pom.xml
+++ b/wicket-devutils/pom.xml
@@ -31,7 +31,10 @@
 		are typically used during development only, but may be 
 		turned on for additional production debugging.
 	</description>
-
+	<properties>
+		<osgi.export.package>org.apache.wicket.devutils*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+	</properties>
 	<dependencies>
 		<dependency>
 			<groupId>org.apache.wicket</groupId>
diff --git a/wicket-extensions/pom.xml b/wicket-extensions/pom.xml
index 237444ad39..2c0824ea03 100644
--- a/wicket-extensions/pom.xml
+++ b/wicket-extensions/pom.xml
@@ -27,7 +27,10 @@
 	<packaging>bundle</packaging>
 	<name>Wicket Extensions</name>
 	<description>Wicket Extensions is a rich component library for the Wicket framework.</description>
-
+	<properties>
+		<osgi.export.package>org.apache.wicket.extensions*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+	</properties>
 	<dependencies>
 		<dependency>
 			<groupId>com.fasterxml.jackson.core</groupId>
diff --git a/wicket-guice/pom.xml b/wicket-guice/pom.xml
index 760dede85a..19a4e359a6 100644
--- a/wicket-guice/pom.xml
+++ b/wicket-guice/pom.xml
@@ -30,7 +30,10 @@
 		Google Guice integration in your Wicket web applications. See the
 		examples project for usecases.
 	</description>
-
+	<properties>
+		<osgi.export.package>org.apache.wicket.guice*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+	</properties>
 	<dependencies>
 		<dependency>
 			<groupId>com.google.inject</groupId>
diff --git a/wicket-ioc/pom.xml b/wicket-ioc/pom.xml
index b703e0ccd2..ccbed04c02 100644
--- a/wicket-ioc/pom.xml
+++ b/wicket-ioc/pom.xml
@@ -30,7 +30,10 @@
 		Wicket IoC common dependencies for injection and proxying. Used by
 		Spring, Guice, etc.
 	</description>
-
+	<properties>
+		<osgi.export.package>org.apache.wicket.injection*;-noimport:=true,org.apache.wicket.proxy*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+	</properties>
 	<dependencies>
 		<dependency>
 			<groupId>cglib</groupId>
diff --git a/wicket-jmx/pom.xml b/wicket-jmx/pom.xml
index 91db5a04d4..6a45ddf4a2 100644
--- a/wicket-jmx/pom.xml
+++ b/wicket-jmx/pom.xml
@@ -27,7 +27,10 @@
 	<packaging>bundle</packaging>
 	<name>Wicket JMX</name>
 	<description>Wicket Java Management Extensions</description>
-
+	<properties>
+		<osgi.export.package>org.apache.wicket.jmx*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+	</properties>
 	<dependencies>
 		<dependency>
 			<groupId>org.apache.wicket</groupId>
diff --git a/wicket-native-websocket/wicket-native-websocket-core/pom.xml b/wicket-native-websocket/wicket-native-websocket-core/pom.xml
index 425c8c7e12..39ddef4f2d 100644
--- a/wicket-native-websocket/wicket-native-websocket-core/pom.xml
+++ b/wicket-native-websocket/wicket-native-websocket-core/pom.xml
@@ -29,7 +29,10 @@
     <packaging>bundle</packaging>
     <name>Wicket Native WebSocket Core</name>
     <description>Provides the common code needed for the different integrations with web container's WebSocket implementations</description>
-
+	<properties>
+		<osgi.export.package>org.apache.wicket.protocol.ws*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+	</properties>
     <dependencies>
         <dependency>
             <groupId>org.apache.wicket</groupId>
diff --git a/wicket-native-websocket/wicket-native-websocket-javax/pom.xml b/wicket-native-websocket/wicket-native-websocket-javax/pom.xml
index 9fe93bfbee..d546a91b9a 100644
--- a/wicket-native-websocket/wicket-native-websocket-javax/pom.xml
+++ b/wicket-native-websocket/wicket-native-websocket-javax/pom.xml
@@ -27,6 +27,10 @@
 	<packaging>bundle</packaging>
 	<name>Wicket Native WebSocket Javax</name>
 	<description>Provides the common code needed for the different integrations with web container's WebSocket implementations</description>
+	<properties>
+		<osgi.export.package>org.apache.wicket.protocol.ws.javax*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+	</properties>
 
 	<dependencies>
 		<dependency>
diff --git a/wicket-objectsizeof-agent/pom.xml b/wicket-objectsizeof-agent/pom.xml
index 7de72255e5..3d5d539b9d 100644
--- a/wicket-objectsizeof-agent/pom.xml
+++ b/wicket-objectsizeof-agent/pom.xml
@@ -27,7 +27,10 @@
 	<packaging>jar</packaging>
 	<name>Wicket Objects Sizeof Agent</name>
 	<description>Agent for pluggin in object size measurements using instrumentation</description>
-
+	<properties>
+		<osgi.export.package>org.apache.wicket.util.instrument*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
+	</properties>
 	<dependencies>
 		<dependency>
 			<groupId>org.apache.wicket</groupId>
diff --git a/wicket-request/pom.xml b/wicket-request/pom.xml
index f4b9aa7b04..50ff3cabb5 100755
--- a/wicket-request/pom.xml
+++ b/wicket-request/pom.xml
@@ -28,6 +28,8 @@
   <url>http://maven.apache.org</url>
 
     <properties>
+         <osgi.export.package>org.apache.wicket.request*;-noimport:=true</osgi.export.package>
+         <osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
         <automatic-module-name>org.apache.wicket.request</automatic-module-name>
     </properties>
 
diff --git a/wicket-spring/pom.xml b/wicket-spring/pom.xml
index 0d795c4267..99c554b4cb 100644
--- a/wicket-spring/pom.xml
+++ b/wicket-spring/pom.xml
@@ -29,6 +29,8 @@
 	<description>Integration project to use Spring injection in your Wicket applications. See the wicket-spring-examples for integration patterns.</description>
 
 	<properties>
+		<osgi.export.package>org.apache.wicket.spring*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
 		<automatic-module-name>org.apache.wicket.spring</automatic-module-name>
 	</properties>
 
diff --git a/wicket-user-guide/src/main/asciidoc/karaf.adoc b/wicket-user-guide/src/main/asciidoc/karaf.adoc
new file mode 100644
index 0000000000..b28b04f643
--- /dev/null
+++ b/wicket-user-guide/src/main/asciidoc/karaf.adoc
@@ -0,0 +1,3 @@
+
+
+
diff --git a/wicket-user-guide/src/main/asciidoc/karaf/karaf_1.adoc b/wicket-user-guide/src/main/asciidoc/karaf/karaf_1.adoc
new file mode 100644
index 0000000000..5dde7fbaf2
--- /dev/null
+++ b/wicket-user-guide/src/main/asciidoc/karaf/karaf_1.adoc
@@ -0,0 +1,75 @@
+
+
+
+Wicket jar files are packaged as OSGi bundles and are ready to be installed in OSGi environments, such as Apache Karaf.
+
+Wicket provides a Karaf feature file to assist in installation and building Karaf distributions that include Wicket.
+
+==== Add Wicket feature
+
+[source,subs="quotes"]
+----
+karaf@root()> repo-add mvn:org.apache.wicket/wicket/_version_/xml/features
+Adding feature url mvn:org.apache.wicket/wicket/_version_/xml/features
+----
+
+==== Verify Wicket feature
+
+[source,subs="quotes"]
+----
+karaf@root()> feature:list | grep -i wicket
+wicket-core    │ _version_ │    │ Uninstalled │ org.apache.wicket.wicket-_version_ │
+----
+
+==== Install Wicket feature
+
+[source,subs="quotes"]
+----
+karaf@root()> feature:install wicket-core
+----
+
+==== Troubleshooting
+
+Inspect the wicket-core feature
+
+[source,subs="quotes"]
+----
+karaf@root()> feature:info wicket-core
+Feature wicket-core _version_
+Feature has no configuration
+Feature has no configuration files
+Feature has no dependencies.
+Feature contains followed bundles:
+  ... _wicket dependency bundles_ ...
+  mvn:org.apache.wicket/wicket-util/_version_
+  mvn:org.apache.wicket/wicket-request/_version_
+  mvn:org.apache.wicket/wicket-core/_version_
+  mvn:org.apache.wicket/wicket-auth-roles/_version_
+  mvn:org.apache.wicket/wicket-devutils/_version_
+  mvn:org.apache.wicket/wicket-extensions/_version_
+  mvn:org.apache.wicket/wicket-jmx/_version_
+Feature has no conditionals.
+----
+
+Wicket feature Maven coordinates
+
+The Wicket feature may be referenced from Maven to include in Karaf assemblies.
+
+[source,xml]
+----
+<dependency>
+  <groupId>org.apache.wicket</groupId>
+  <artifactId>wicket</artifactId>
+  <version>...version...</version>
+  <type>xml</type>
+  <classifier>features</classifier>
+</dependency>
+----
+
+==== Reference links
+
+https://karaf.apache.org[Apache Karaf website]
+
+https://karaf.apache.org/manual/latest/provisioning[Apache Karaf features]
+
+
diff --git a/wicket-user-guide/src/main/asciidoc/single.adoc b/wicket-user-guide/src/main/asciidoc/single.adoc
index e7f96e844d..b575f27ad1 100644
--- a/wicket-user-guide/src/main/asciidoc/single.adoc
+++ b/wicket-user-guide/src/main/asciidoc/single.adoc
@@ -882,6 +882,15 @@ include::wicketstuff/wicketstuff_7.adoc[leveloffset=+1]
 
 include::redirects.adoc[]
 
+[appendix]
+== Working with Karaf
+
+include::karaf.adoc[]
+
+=== Wicket feature
+
+include::karaf/karaf_1.adoc[leveloffset=+1]
+
 [appendix]
 == Contributing to this guide
 
diff --git a/wicket-util/pom.xml b/wicket-util/pom.xml
index db2551714b..4395682032 100755
--- a/wicket-util/pom.xml
+++ b/wicket-util/pom.xml
@@ -28,6 +28,8 @@
 	<name>Wicket Util</name>
 
 	<properties>
+		<osgi.export.package>org.apache.wicket.util*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
 		<automatic-module-name>org.apache.wicket.util</automatic-module-name>
 	</properties>
 
diff --git a/wicket-velocity/pom.xml b/wicket-velocity/pom.xml
index 2de840254e..e7d513ca05 100644
--- a/wicket-velocity/pom.xml
+++ b/wicket-velocity/pom.xml
@@ -33,6 +33,8 @@
 	</description>
 
 	<properties>
+		<osgi.export.package>org.apache.wicket.velocity*;-noimport:=true</osgi.export.package>
+		<osgi.import.package>!java*,!kotlin*,!sun.nio.ch,org.slf4j*;version="[1.7,3)",*</osgi.import.package>
 		<automatic-module-name>org.apache.wicket.velocity</automatic-module-name>
 	</properties>
 
diff --git a/wicket/pom.xml b/wicket/pom.xml
index 12b15cade0..13604cf31a 100644
--- a/wicket/pom.xml
+++ b/wicket/pom.xml
@@ -54,6 +54,49 @@
 					</execution>
 				</executions>
 			</plugin>
+			<plugin>
+				<artifactId>maven-resources-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>copy-resources</id>
+						<phase>validate</phase>
+						<goals>
+							<goal>copy-resources</goal>
+						</goals>
+						<configuration>
+							<outputDirectory>target/classes</outputDirectory>
+							<resources>
+								<resource>
+									<directory>src/main/filtered-resources</directory>
+									<filtering>true</filtering>
+								</resource>
+							</resources>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>build-helper-maven-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>attach-artifacts</id>
+						<phase>package</phase>
+						<goals>
+							<goal>attach-artifact</goal>
+						</goals>
+						<configuration>
+							<artifacts>
+								<artifact>
+									<file>${project.build.outputDirectory}/features.xml</file>
+									<type>xml</type>
+									<classifier>features</classifier>
+								</artifact>
+							</artifacts>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
 		</plugins>
 	</build>
 </project>
diff --git a/wicket/src/main/filtered-resources/features.xml b/wicket/src/main/filtered-resources/features.xml
new file mode 100644
index 0000000000..8ae5fcf4a3
--- /dev/null
+++ b/wicket/src/main/filtered-resources/features.xml
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Wicket feature for Apache Karaf 
+
+     karaf> repo-add mvn:org.apache.wicket/wicket/${project.verion}/xml/features
+     karaf> feature:install wicket-core
+
+     ref: wicket-user-guide single.html#_working_with_karaf
+-->
+<features xmlns="http://karaf.apache.org/xmlns/features/v1.4.0" name="${project.groupId}.${project.artifactId}-${project.version}">
+	<feature name="wicket-core" version="${project.version}" start-level="50">
+		<bundle>mvn:com.github.openjson/openjson/${openjson.version}</bundle>
+		<bundle>mvn:commons-io/commons-io/${commons-io.version}</bundle>
+		<bundle>mvn:commons-fileupload/commons-fileupload/${commons-fileupload.version}</bundle>
+		<bundle>mvn:org.apache.commons/commons-collections4/${commons-collections4.version}</bundle>
+		<bundle>mvn:org.danekja/jdk-serializable-functional/${jdk-serializable-functional.version}</bundle>
+		<bundle>mvn:org.apache.wicket/wicket-util/${project.version}</bundle>
+		<bundle>mvn:org.apache.wicket/wicket-request/${project.version}</bundle>
+		<bundle>mvn:org.apache.wicket/wicket-core/${project.version}</bundle>
+		<bundle>mvn:org.apache.wicket/wicket-auth-roles/${project.version}</bundle>
+		<bundle>mvn:org.apache.wicket/wicket-devutils/${project.version}</bundle>
+		<bundle>mvn:org.apache.wicket/wicket-extensions/${project.version}</bundle>
+		<bundle>mvn:org.apache.wicket/wicket-jmx/${project.version}</bundle>
+		<capability>wicket;provider:=apache-wicket</capability>
+	</feature>
+</features>