merge of the actual 2.x into the 3.0

diff --git a/bundles/jaxrs-ri/pom.xml b/bundles/jaxrs-ri/pom.xml
index ef1772f..130bbf7 100644
--- a/bundles/jaxrs-ri/pom.xml
+++ b/bundles/jaxrs-ri/pom.xml
@@ -395,6 +395,9 @@
                                 <jar destfile="${project.build.directory}/${project.artifactId}-sources.jar" update="true">
                                     <zipfileset dir="../.." includes="NOTICE.md" prefix="META-INF" />
                                 </jar>
+                                <jar destfile="${project.build.directory}/${project.artifactId}.jar" update="true">
+                                    <zipfileset dir="../.." includes="LICENSE.md" prefix="META-INF" />
+                                </jar>
                             </target>
                         </configuration>
                         <goals>
diff --git a/connectors/netty-connector/src/main/java/org/glassfish/jersey/netty/connector/NettyConnector.java b/connectors/netty-connector/src/main/java/org/glassfish/jersey/netty/connector/NettyConnector.java
index ede8c36..ab71e1f 100644
--- a/connectors/netty-connector/src/main/java/org/glassfish/jersey/netty/connector/NettyConnector.java
+++ b/connectors/netty-connector/src/main/java/org/glassfish/jersey/netty/connector/NettyConnector.java
@@ -315,7 +315,12 @@
                }
 
                // Make the connection attempt.
-               chan = b.connect(host, port).sync().channel();
+                try {
+                    chan = b.connect(host, port).sync().channel();
+                } catch (Exception e) {
+                    responseAvailable.completeExceptionally(e);
+                    return;
+                }
             }
 
             // assert: clientHandler will always notify responseDone: either normally, or exceptionally
diff --git a/connectors/netty-connector/src/test/java/org/glassfish/jersey/netty/connector/ConnectionExceptionTest.java b/connectors/netty-connector/src/test/java/org/glassfish/jersey/netty/connector/ConnectionExceptionTest.java
new file mode 100644
index 0000000..d35394e
--- /dev/null
+++ b/connectors/netty-connector/src/test/java/org/glassfish/jersey/netty/connector/ConnectionExceptionTest.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.jersey.netty.connector;
+
+import org.glassfish.jersey.client.ClientConfig;
+import org.glassfish.jersey.client.ClientProperties;
+import org.junit.jupiter.api.Assertions;
+import org.junit.jupiter.api.Test;
+
+import jakarta.ws.rs.ProcessingException;
+import jakarta.ws.rs.client.ClientBuilder;
+import jakarta.ws.rs.core.Response;
+
+public class ConnectionExceptionTest {
+    @Test
+    public void testConnectionException() throws InterruptedException {
+        Assertions.assertThrows(ProcessingException.class, ()-> {
+            ClientConfig clientConfig = new ClientConfig();
+            clientConfig.connectorProvider(new NettyConnectorProvider());
+
+            Response r = ClientBuilder.newClient(clientConfig)
+                    .property(ClientProperties.CONNECT_TIMEOUT, 1000)
+                    .property(ClientProperties.READ_TIMEOUT, 1000)
+                    .target("http://test.nonono:8080").request().get();
+            r.close();
+        });
+    }
+}
diff --git a/core-server/src/main/java/org/glassfish/jersey/server/ChunkedOutput.java b/core-server/src/main/java/org/glassfish/jersey/server/ChunkedOutput.java
index faf37de..2ce0542 100644
--- a/core-server/src/main/java/org/glassfish/jersey/server/ChunkedOutput.java
+++ b/core-server/src/main/java/org/glassfish/jersey/server/ChunkedOutput.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2012, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2012, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -19,6 +19,7 @@
 import java.io.Closeable;
 import java.io.IOException;
 import java.io.OutputStream;
+import java.io.UncheckedIOException;
 import java.lang.reflect.Type;
 import java.util.Collections;
 import java.util.concurrent.BlockingDeque;
@@ -255,11 +256,11 @@
                                 // if MBW replaced the stream, let's make sure to set it in the response context.
                                 responseContext.setEntityStream(writtenStream);
                             }
-                        } catch (final IOException ioe) {
+                        } catch (final IOException | UncheckedIOException ioe) {
                             connectionCallback.onDisconnect(asyncContext);
                             throw ioe;
                         } catch (final MappableException mpe) {
-                            if (mpe.getCause() instanceof IOException) {
+                            if (mpe.getCause() instanceof IOException || mpe.getCause() instanceof UncheckedIOException) {
                                 connectionCallback.onDisconnect(asyncContext);
                             }
                             throw mpe;
diff --git a/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseyEventSink.java b/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseyEventSink.java
index 1848144..b1b1dc0 100644
--- a/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseyEventSink.java
+++ b/media/sse/src/main/java/org/glassfish/jersey/media/sse/internal/JerseyEventSink.java
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved.
+ * Copyright (c) 2017, 2023 Oracle and/or its affiliates. All rights reserved.
  *
  * This program and the accompanying materials are made available under the
  * terms of the Eclipse Public License v. 2.0, which is available at
@@ -139,7 +139,7 @@
         try {
             this.write(event);
             return CompletableFuture.completedFuture(null);
-        } catch (IOException e) {
+        } catch (Exception e) {
             CompletableFuture<Void> future = new CompletableFuture<>();
             future.completeExceptionally(e);
             return future;
diff --git a/tests/release-test/pom.xml b/tests/release-test/pom.xml
index 6f7ad39..53eaf39 100644
--- a/tests/release-test/pom.xml
+++ b/tests/release-test/pom.xml
@@ -65,7 +65,7 @@
             <dependency>
                 <groupId>org.glassfish.jersey</groupId>
                 <artifactId>jersey-bom</artifactId>
-                <version>${jersey.version}</version>
+                <version>${project.version}</version>
                 <scope>import</scope>
                 <type>pom</type>
             </dependency>
diff --git a/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/LegalDocsIncludedTest.java b/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/LegalDocsIncludedTest.java
new file mode 100644
index 0000000..74e0281
--- /dev/null
+++ b/tests/release-test/src/test/java/org/glassfish/jersey/test/artifacts/LegalDocsIncludedTest.java
@@ -0,0 +1,63 @@
+/*
+ * Copyright (c) 2023 Oracle and/or its affiliates. All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0, which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * This Source Code may also be made available under the following Secondary
+ * Licenses when the conditions for such availability set forth in the
+ * Eclipse Public License v. 2.0 are satisfied: GNU General Public License,
+ * version 2 with the GNU Classpath Exception, which is available at
+ * https://www.gnu.org/software/classpath/license.html.
+ *
+ * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0
+ */
+
+package org.glassfish.jersey.test.artifacts;
+
+import org.apache.maven.plugin.testing.AbstractMojoTestCase;
+import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
+import org.junit.Assert;
+import org.junit.Test;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.List;
+import java.util.Properties;
+import java.util.jar.JarFile;
+import java.util.stream.Collectors;
+
+public class LegalDocsIncludedTest extends AbstractMojoTestCase {
+    private static final File localRepository = MavenUtil.getLocalMavenRepository();
+    private static final Properties properties = MavenUtil.getMavenProperties();
+
+    private static final String LICENSE_FILE = "LICENSE.md";
+    private static final String NOTICE_FILE = "NOTICE.md";
+
+    @Test
+    public void testLegalFiles() throws IOException, XmlPullParserException {
+        TestResult testResult = new TestResult();
+        List<File> jars = MavenUtil.streamJerseyJars()
+                .map(dependency -> MavenUtil.getArtifactJar(localRepository, dependency, properties))
+                .collect(Collectors.toList());
+
+        for (File jar : jars) {
+            for (String filename : new String[]{LICENSE_FILE, NOTICE_FILE}) {
+                JarFile jarFile = new JarFile(jar);
+                String value;
+                try {
+                    value = jarFile.getEntry("META-INF/" + filename).getName();
+                } catch (NullPointerException npe) {
+                    value = null;
+                }
+                TestResult.MessageBuilder builder = value != null ? testResult.ok() : testResult.exception();
+                builder.append(jar.getName()).append(value == null ? " DOES NOT CONTAIN " : " CONTAINS ")
+                        .append(filename).println(" file");
+            }
+        }
+
+        //Assertions.assertTrue(testResult.result(), "Some error occurred, see previous messages");
+        Assert.assertTrue("Some error occurred, see previous messages", testResult.result());
+    }
+}