merge of the actual 3.0 into 3.1

diff --git a/bundles/jaxrs-ri/pom.xml b/bundles/jaxrs-ri/pom.xml
index f676560..064baf9 100644
--- a/bundles/jaxrs-ri/pom.xml
+++ b/bundles/jaxrs-ri/pom.xml
@@ -394,6 +394,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/tests/release-test/pom.xml b/tests/release-test/pom.xml
index 246040a..a28dc22 100644
--- a/tests/release-test/pom.xml
+++ b/tests/release-test/pom.xml
@@ -73,7 +73,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());
+    }
+}