<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.apache.felix</groupId> <artifactId>felix-parent</artifactId> <version>9</version> <relativePath>../../pom/pom.xml</relativePath> </parent> <name>Apache Felix Http Jetty 11.x</name> <description>This is an implementation of the R8.1 OSGi Servlet Service, the R7 OSGi Http Service and the R7 OSGi Http Whiteboard Specification</description> <artifactId>org.apache.felix.http.jetty</artifactId> <version>5.1.28</version> <packaging>bundle</packaging> <scm> <connection>scm:git:https://github.com/apache/felix-dev.git</connection> <developerConnection>scm:git:https://github.com/apache/felix-dev.git</developerConnection> <url>https://gitbox.apache.org/repos/asf?p=felix-dev.git</url> <tag>org.apache.felix.http.jetty-5.1.28</tag> </scm> <properties> <felix.java.version>11</felix.java.version> <jetty.version>11.0.24</jetty.version> <baseline.skip>true</baseline.skip> <org.ops4j.pax.exam.version>4.13.3</org.ops4j.pax.exam.version> <!-- To debug the pax process, override this with -D --> <pax.vm.options>-Xmx512M</pax.vm.options> </properties> <build> <plugins> <!-- Use a groovy script to preserve the META-INF/services/* files for the artifacts that are embeded in the uber jar --> <plugin> <groupId>org.codehaus.gmaven</groupId> <artifactId>groovy-maven-plugin</artifactId> <version>2.1.1</version> <executions> <execution> <id>groovy-magic</id> <phase>prepare-package</phase> <goals> <goal>execute</goal> </goals> <configuration> <source><![CDATA[ // make an output dir for the merged resource files def slDir = new File(project.build.directory, "serviceloader-resources"); slDir.mkdirs(); // scan each of the artifacts to preserve the information found in any META-INF/services/* files project.artifacts.each() { artifact -> if (artifact.getArtifactHandler().isAddedToClasspath() && !org.apache.maven.artifact.Artifact.SCOPE_TEST.equals( artifact.getScope() ) && !"org.eclipse.jetty.websocket".equals(artifact.getGroupId()) // skip the optional websocket artifacts && !"jetty-annotations".equals(artifact.getArtifactId()) // skip the transitive artifacts from the optional websocket artifacts && !"jetty-plus".equals(artifact.getArtifactId()) && !"jetty-webapp".equals(artifact.getArtifactId())) { def jar; try { jar = new java.util.jar.JarFile(artifact.file) jar.stream().each() { entry -> if (!entry.isDirectory() && entry.name.startsWith("META-INF/services/")) { // check if we already have a file with this name def svcFile = new File(slDir, entry.name) def svcSet = new LinkedHashSet(); if (svcFile.exists()) { // found existing file, so load the items from the existing file so we can merge svcFile.eachLine { className -> className = className.trim(); if (!className.isEmpty()) { svcSet.add(className); } } } // read the content of the found entry def lineReader; try { lineReader = new BufferedReader(new InputStreamReader(jar.getInputStream(entry), java.nio.charset.StandardCharsets.UTF_8)); def className; while ( ( className = lineReader.readLine() ) != null ) { className = className.trim(); if (!className.isEmpty()) { svcSet.add(className); } } } finally { // cleanup if (lineReader != null) { lineReader.close() } } // write the merged data to the output file if (!svcSet.isEmpty()) { // make any missing folders svcFile.getParentFile().mkdirs(); svcFile.withWriter('utf-8') { writer -> svcSet.each() { item -> writer.writeLine item; } // finish up with a blank line writer.println(); } } } } } finally { // cleanup if (jar != null) { jar.close(); } } } } ]]></source> </configuration> </execution> </executions> </plugin> <plugin> <groupId>org.apache.felix</groupId> <artifactId>maven-bundle-plugin</artifactId> <version>5.1.9</version> <extensions>true</extensions> <configuration> <instructions> <Bundle-SymbolicName>${project.artifactId}</Bundle-SymbolicName> <Bundle-Version>${project.version}</Bundle-Version> <X-Jetty-Version> ${jetty.version} </X-Jetty-Version> <Bundle-Activator> org.apache.felix.http.jetty.internal.JettyActivator </Bundle-Activator> <Export-Package> org.osgi.service.http, org.osgi.service.http.context, org.osgi.service.http.runtime, org.osgi.service.http.runtime.dto, org.osgi.service.http.whiteboard, org.osgi.service.servlet.context, org.osgi.service.servlet.runtime, org.osgi.service.servlet.runtime.dto, org.osgi.service.servlet.whiteboard, org.eclipse.jetty.alpn.server, org.eclipse.jetty.http.*, org.eclipse.jetty.http2.*, org.eclipse.jetty.io.*, org.eclipse.jetty.jmx.*, org.eclipse.jetty.security.*, org.eclipse.jetty.server.*, org.eclipse.jetty.servlet.*, org.eclipse.jetty.util.*, org.apache.felix.http.jetty, org.apache.felix.http.jakartawrappers, org.apache.felix.http.javaxwrappers </Export-Package> <Private-Package> org.apache.felix.http.base.*, org.apache.felix.http.jetty.*, org.eclipse.jetty, org.eclipse.jetty.version </Private-Package> <Conditional-Package> org.apache.commons.* </Conditional-Package> <Import-Package> sun.misc;resolution:=optional, sun.nio.ch;resolution:=optional, javax.imageio;resolution:=optional, javax.sql;resolution:=optional, org.ietf.jgss;resolution:=optional, org.osgi.service.cm;resolution:=optional;version="[1.3,2)", org.osgi.service.event;resolution:=optional;version="[1.2,2)", org.osgi.service.log;resolution:=optional;version="[1.3,2)", org.osgi.service.metatype;resolution:=optional;version="[1.1,2)", org.osgi.service.useradmin;resolution:=optional;version="[1.1,2)", org.osgi.service.http;version="[1.2.1,1.3)", org.osgi.service.http.context;version="[1.1,1.2)", org.osgi.service.http.runtime;version="[1.1,1.2)", org.osgi.service.http.runtime.dto;version="[1.1,1.2)", org.slf4j;version="[1.0,3.0)", * </Import-Package> <DynamicImport-Package> org.osgi.service.cm;version="[1.3,2)", org.osgi.service.event;version="[1.2,2)", org.osgi.service.log;version="[1.3,2)", org.osgi.service.metatype;version="[1.4,2)" </DynamicImport-Package> <Provide-Capability> osgi.implementation;osgi.implementation="osgi.http";version:Version="1.1"; uses:="javax.servlet,javax.servlet.http,org.osgi.service.http.context,org.osgi.service.http.whiteboard", osgi.implementation;osgi.implementation="osgi.http";version:Version="2.0"; uses:="jakarta.servlet,jakarta.servlet.http,org.osgi.service.servlet.context,org.osgi.service.servlet.whiteboard", osgi.service;objectClass:List<String>="org.osgi.service.servlet.runtime.HttpServiceRuntime"; uses:="org.osgi.service.servlet.runtime,org.osgi.service.servlet.runtime.dto", osgi.service;objectClass:List<String>="org.osgi.service.http.runtime.HttpServiceRuntime"; uses:="org.osgi.service.http.runtime,org.osgi.service.http.runtime.dto", osgi.service;objectClass:List<String>="org.osgi.service.http.HttpService"; uses:="org.osgi.service.http", osgi.serviceloader;osgi.serviceloader="org.eclipse.jetty.http.HttpFieldPreEncoder" </Provide-Capability> <Require-Capability> osgi.contract;filter:="(&(osgi.contract=JavaServlet)(version=4.0))", osgi.contract;filter:="(&(osgi.contract=JakartaServlet)(version=5.0))", osgi.extender;filter:="(osgi.extender=osgi.serviceloader.registrar)";resolution:=optional, osgi.extender;filter:="(osgi.extender=osgi.serviceloader.processor)";resolution:=optional, osgi.serviceloader;filter:="(osgi.serviceloader=org.eclipse.jetty.http.HttpFieldPreEncoder)";resolution:=optional;cardinality:=multiple, osgi.serviceloader;filter:="(osgi.serviceloader=org.eclipse.jetty.io.ssl.ALPNProcessor$Server)";resolution:=optional;cardinality:=multiple </Require-Capability> <Include-Resource> {maven-resources},${project.build.directory}/serviceloader-resources </Include-Resource> <_removeheaders> Private-Package,Conditional-Package </_removeheaders> </instructions> </configuration> <executions> <execution> <id>bundle</id> <phase>package</phase> <goals> <goal>bundle</goal> </goals> </execution> <execution> <id>baseline</id> <goals> <goal>baseline</goal> </goals> </execution> <execution> <id>light-bundle</id> <goals> <goal>bundle</goal> </goals> <configuration> <classifier>light</classifier> <instructions> <Bundle-Name>${project.name} Light</Bundle-Name> <Bundle-SymbolicName>${project.artifactId}.light</Bundle-SymbolicName> <!-- We need to override this from the base configuration --> <Conditional-Package> foo </Conditional-Package> <Export-Package> org.osgi.service.http, org.osgi.service.http.context, org.osgi.service.http.runtime, org.osgi.service.http.runtime.dto, org.osgi.service.http.whiteboard, org.osgi.service.servlet.context, org.osgi.service.servlet.runtime, org.osgi.service.servlet.runtime.dto, org.osgi.service.servlet.whiteboard, org.apache.felix.http.jetty, org.apache.felix.http.javaxwrappers, org.apache.felix.http.jakartawrappers </Export-Package> <Private-Package> org.apache.felix.http.base.*, org.apache.felix.http.jetty.*, </Private-Package> <Import-Package> org.osgi.service.cm;resolution:=optional;version="[1.3,2)", org.osgi.service.event;resolution:=optional;version="[1.2,2)", org.osgi.service.log;resolution:=optional;version="[1.3,2)", org.osgi.service.metatype;resolution:=optional;version="[1.4,2)", org.osgi.service.useradmin;resolution:=optional;version="[1.1,2)", org.osgi.service.http;version="[1.2.1,1.3)", org.osgi.service.http.context;version="[1.1,1.2)", org.osgi.service.http.runtime;version="[1.1,1.2)", org.osgi.service.http.runtime.dto;version="[1.1,1.2)", * </Import-Package> <!-- We need to override this from the base configuration to exclude the ServiceLoader capabilities --> <Provide-Capability> osgi.implementation;osgi.implementation="osgi.http";version:Version="1.1"; uses:="javax.servlet,javax.servlet.http,org.osgi.service.http.context,org.osgi.service.http.whiteboard", osgi.implementation;osgi.implementation="osgi.http";version:Version="2.0"; uses:="jakarta.servlet,jakarta.servlet.http,org.osgi.service.servlet.context,org.osgi.service.servlet.whiteboard", osgi.service;objectClass:List<String>="org.osgi.service.servlet.runtime.HttpServiceRuntime"; uses:="org.osgi.service.servlet.runtime,org.osgi.service.servlet.runtime.dto", osgi.service;objectClass:List<String>="org.osgi.service.http.runtime.HttpServiceRuntime"; uses:="org.osgi.service.http.runtime,org.osgi.service.http.runtime.dto", osgi.service;objectClass:List<String>="org.osgi.service.http.HttpService"; uses:="org.osgi.service.http" </Provide-Capability> <!-- We need to override this from the base configuration to exclude the ServiceLoader capabilities --> <Require-Capability> osgi.contract;filter:="(&(osgi.contract=JavaServlet)(version=4.0))", osgi.contract;filter:="(&(osgi.contract=JakartaServlet)(version=5.0))" </Require-Capability> <!-- We need to override this from the base configuration to exclude the ServiceLoader resources --> <Include-Resource> {maven-resources} </Include-Resource> <_removeheaders> X-Jetty-Version,Private-Package,Conditional-Package </_removeheaders> </instructions> </configuration> </execution> </executions> </plugin> <plugin> <artifactId>maven-surefire-plugin</artifactId> <configuration> <redirectTestOutputToFile>true</redirectTestOutputToFile> </configuration> </plugin> <!-- plugins for paxexam integration tests --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-failsafe-plugin</artifactId> <executions> <execution> <id>integration-test</id> <phase>integration-test</phase> <goals> <goal>integration-test</goal> </goals> </execution> <execution> <id>verify</id> <phase>integration-test</phase> <goals> <goal>verify</goal> </goals> </execution> </executions> <configuration> <redirectTestOutputToFile>true</redirectTestOutputToFile> <systemPropertyVariables> <jetty.version>${jetty.version}</jetty.version> <bundle.filename>${basedir}/target/${project.build.finalName}.jar</bundle.filename> <pax.vm.options>${pax.vm.options}</pax.vm.options> </systemPropertyVariables> </configuration> </plugin> </plugins> </build> <dependencies> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>osgi.core</artifactId> <version>6.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.service.cm</artifactId> <version>1.5.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.service.event</artifactId> <version>1.3.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.service.metatype</artifactId> <version>1.4.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.service.useradmin</artifactId> <version>1.1.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-servlet</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-server</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-util</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-util-ajax</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-jmx</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-security</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty.http2</groupId> <artifactId>http2-server</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty.http2</groupId> <artifactId>http2-common</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty.http2</groupId> <artifactId>http2-hpack</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-alpn-server</artifactId> <version>${jetty.version}</version> </dependency> <dependency> <groupId>org.eclipse.jetty.websocket</groupId> <artifactId>websocket-jakarta-server</artifactId> <version>${jetty.version}</version> <optional>true</optional> </dependency> <dependency> <groupId>org.eclipse.jetty.websocket</groupId> <artifactId>websocket-jetty-server</artifactId> <version>${jetty.version}</version> <optional>true</optional> </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.service.servlet</artifactId> <version>2.0.0</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.service.http</artifactId> <version>1.2.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.service.http.whiteboard</artifactId> <version>1.1.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.http.base</artifactId> <version>5.1.10</version> </dependency> <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.http.wrappers</artifactId> <version>1.0.6</version> </dependency> <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.5</version> </dependency> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.14.0</version> </dependency> <!-- Testing --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>org.mockito</groupId> <artifactId>mockito-core</artifactId> <version>5.7.0</version> <scope>test</scope> </dependency> <dependency> <groupId>org.osgi</groupId> <artifactId>org.osgi.service.log</artifactId> <version>1.3.0</version> <scope>test</scope> </dependency> <!-- an OSGi framework --> <dependency> <groupId>org.apache.felix</groupId> <artifactId>org.apache.felix.framework</artifactId> <version>7.0.5</version> <scope>test</scope> </dependency> <dependency> <groupId>javax.inject</groupId> <artifactId>javax.inject</artifactId> <version>1</version> <scope>test</scope> </dependency> <!-- Pax Exam --> <dependency> <groupId>org.ops4j.pax.exam</groupId> <artifactId>pax-exam</artifactId> <version>${org.ops4j.pax.exam.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.ops4j.pax.exam</groupId> <artifactId>pax-exam-cm</artifactId> <version>${org.ops4j.pax.exam.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.ops4j.pax.exam</groupId> <artifactId>pax-exam-container-forked</artifactId> <version>${org.ops4j.pax.exam.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.ops4j.pax.exam</groupId> <artifactId>pax-exam-junit4</artifactId> <version>${org.ops4j.pax.exam.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.ops4j.pax.exam</groupId> <artifactId>pax-exam-link-mvn</artifactId> <version>${org.ops4j.pax.exam.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-client</artifactId> <version>${jetty.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.eclipse.jetty.websocket</groupId> <artifactId>websocket-jetty-client</artifactId> <version>${jetty.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.awaitility</groupId> <artifactId>awaitility</artifactId> <version>4.2.1</version> <scope>test</scope> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-simple</artifactId> <version>2.0.13</version> <scope>test</scope> </dependency> </dependencies> </project>