Merge branch '4.0.0-M3' - part 1
diff --git a/bom/pom.xml b/bom/pom.xml index be0d0b6..9a106a9 100644 --- a/bom/pom.xml +++ b/bom/pom.xml
@@ -1,6 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- + Copyright (c) 2022, 2026 Contributors to Eclipse Foundation. Copyright (c) 2013, 2020 Oracle and/or its affiliates. All rights reserved. COpyright (c) 2020 Payara Services Ltd.
diff --git a/hk2-testing/di-tck/pom.xml b/hk2-testing/di-tck/pom.xml index 8c0e674..f90ddae 100644 --- a/hk2-testing/di-tck/pom.xml +++ b/hk2-testing/di-tck/pom.xml
@@ -22,13 +22,17 @@ <parent> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-testing</artifactId> +<<<<<<< HEAD <version>3.1.1</version> +======= + <version>4.0.0-M3</version> +>>>>>>> refs/heads/4.0.0-M3 </parent> <artifactId>hk2-di-tck-runner</artifactId> <name>DI TCK Runner</name> <description>Runner for the Jakarta DI TCK</description> - + <properties> <ditck.version>2.0.1</ditck.version> </properties>
diff --git a/javadocs/pom.xml b/javadocs/pom.xml index 998f228..b7de4fc 100644 --- a/javadocs/pom.xml +++ b/javadocs/pom.xml
@@ -22,7 +22,11 @@ <parent> <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-parent</artifactId> +<<<<<<< HEAD <version>3.1.1</version> +======= + <version>4.0.0-M3</version> +>>>>>>> refs/heads/4.0.0-M3 </parent> <artifactId>hk2-javadocs</artifactId> <name>HK2 Javadocs</name>
diff --git a/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/AbstractOSGiModulesRegistryImpl.java b/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/AbstractOSGiModulesRegistryImpl.java index 32f7e52..5f91079 100755 --- a/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/AbstractOSGiModulesRegistryImpl.java +++ b/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/AbstractOSGiModulesRegistryImpl.java
@@ -48,6 +48,7 @@ * OSGi BundleContext - used to install/uninstall, start/stop bundles */ BundleContext bctx; + protected PackageAdmin pa; private Map<ModuleChangeListener, BundleListener> moduleChangeListeners = new HashMap<>(); private Map<ModuleLifecycleListener, BundleListener> moduleLifecycleListeners = new HashMap<>(); @@ -60,6 +61,13 @@ pa = PackageAdmin.class.cast(bctx.getService(ref)); } + /** + * @return the BundleContext + */ + public BundleContext getBundleContext() { + return bctx; + } + @Override public void shutdown() { modules.clear(); @@ -108,7 +116,7 @@ DynamicConfiguration dcs = createDynamicConfiguration(serviceLocator); for (Descriptor descriptor : descriptors) { - + DescriptorImpl di = (descriptor instanceof DescriptorImpl) ? (DescriptorImpl) descriptor : new DescriptorImpl(descriptor) ; // set the hk2loader @@ -290,6 +298,7 @@ public void addModuleChangeListener(final ModuleChangeListener listener, final OSGiModuleImpl module) { BundleListener bundleListener = new BundleListener() { + @Override public void bundleChanged(BundleEvent event) { if ((event.getBundle() == module.getBundle()) && ((event.getType() & BundleEvent.UPDATED) == BundleEvent.UPDATED)) { @@ -314,6 +323,7 @@ public void register(final ModuleLifecycleListener listener) { // This is purposefully made an asynchronous bundle listener BundleListener bundleListener = new BundleListener() { + @Override public void bundleChanged(BundleEvent event) { switch (event.getType()) { case BundleEvent.INSTALLED: @@ -349,47 +359,47 @@ /*package*/ HK2Module getModule(Bundle bundle) { return modules.get(new OSGiModuleId(bundle)); } - + @Override public void remove(HK2Module module) { super.remove(module); - + if (!(module instanceof OSGiModuleImpl)) { return; } - + OSGiModuleImpl oModule = (OSGiModuleImpl) module; Bundle bundle = oModule.getBundle(); - + String bsn = bundle.getSymbolicName(); String version = bundle.getVersion().toString(); - + Set<ServiceLocator> locators = getAllServiceLocators(); - + for (ServiceLocator locator : locators) { if (!ServiceLocatorState.RUNNING.equals(locator.getState())) continue; - + ServiceLocatorUtilities.removeFilter(locator, new RemoveFilter(bsn, version)); } } - + private static class RemoveFilter implements Filter { private final String bsn; private final String version; - + private RemoveFilter(String bsn, String version) { this.bsn = bsn; this.version = version; } - + private static String getMetadataValue(Descriptor d, String key) { Map<String, List<String>> metadata = d.getMetadata(); - + List<String> values = metadata.get(key); if (values == null || values.size() <= 0) { return null; } - + return values.get(0); } @@ -397,12 +407,12 @@ public boolean matches(Descriptor d) { String dBSN = getMetadataValue(d, OsgiPopulatorPostProcessor.BUNDLE_SYMBOLIC_NAME); if (dBSN == null || !dBSN.equals(bsn)) return false; - + String dVersion = getMetadataValue(d, OsgiPopulatorPostProcessor.BUNDLE_VERSION); if (dVersion == null) return false; - + return dVersion.equals(version); } - + } }
diff --git a/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/FelixPrettyPrinter.java b/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/FelixPrettyPrinter.java new file mode 100644 index 0000000..cba598d --- /dev/null +++ b/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/FelixPrettyPrinter.java
@@ -0,0 +1,338 @@ +/* + * Copyright (c) 2022, 2026 Contributors to the Eclipse Foundation + * Copyright (c) 2008, 2021 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.jvnet.hk2.osgiadapter; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStreamReader; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Enumeration; +import java.util.HashSet; +import java.util.LinkedHashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.BundleException; +import org.osgi.framework.wiring.BundleRevision; +import org.osgi.resource.Capability; + +import static java.nio.charset.StandardCharsets.UTF_8; +import static org.osgi.framework.namespace.PackageNamespace.PACKAGE_NAMESPACE; + +/** + * Tools for obtaining readable information from the {@link BundleException} + */ +public class FelixPrettyPrinter { + + private static final Pattern BUNDLE_PATTERN = Pattern.compile("\\[(\\d+)\\]", Pattern.MULTILINE); + + public static void main(String[] args) { + System.out.println(prettyPrintExceptionMessage("org.osgi.framework.BundleException: Unable to resolve org.glassfish.main.web.weld-integration [41](R 41.0): missing requirement [org.glassfish.main.web.weld-integration [41](R 41.0)] osgi.wiring.package; (&(osgi.wiring.package=jakarta.faces.application)(version>=4.1.0)(!(version>=5.0.0))) [caused by: Unable to resolve org.glassfish.jakarta.faces [291](R 291.0): missing requirement [org.glassfish.jakarta.faces [291](R 291.0)] osgi.wiring.package; (&(osgi.wiring.package=jakarta.enterprise.inject)(version>=4.1.0)(!(version>=5.0.0)))] Unresolved requirements: [[org.glassfish.main.web.weld-integration [41](R 41.0)] osgi.wiring.package; (&(osgi.wiring.package=jakarta.faces.application)(version>=4.1.0)(!(version>=5.0.0)))]")); + } + + public static String prettyPrintFelixMessage(BundleContext context, final String bundleMessage) { + final String prettyMessage = prettyPrintExceptionMessage(bundleMessage); + + final StringBuilder bundleBuilder = new StringBuilder(1024); + bundleBuilder.append(prettyMessage); + + List<Long> bundleIDs = new ArrayList<>(); + + bundleIDs.addAll(addExportingBundles(context, prettyMessage, bundleBuilder)); + bundleIDs.addAll(findBundleIds(prettyMessage)); + + if (!bundleIDs.isEmpty()) { + for (Long bundleId : bundleIDs) { + Bundle bundle = context.getBundle(bundleId); + if (bundle != null) { + bundleBuilder.append('[').append(bundleId).append("] \n"); + bundleBuilder.append("jar = ").append(bundle.getLocation()); + tryAddPomProperties(bundle, bundleBuilder); + bundleBuilder.append('\n'); + } + } + } + + return bundleBuilder.toString(); + } + + /** + * Prints exception messages from Felix bundle classloading in a more human readable way. + * + * @param message - error message from the exception + * @return multiline human readable string + */ + public static String prettyPrintExceptionMessage(final String message) { + StringBuilder messageBuilder = new StringBuilder(256); + try { + int index = message.indexOf("Unable to resolve"); + int indent = 0; + while (index >= 0) { + printLn(messageBuilder, indent, "Unable to resolve"); + index += "Unable to resolve".length(); + + int index2 = message.indexOf("missing requirement", index); + if (index2 >= 0) { + + indent++; + + // Module name would be e.g. + // org.glassfish.server.internal.batch.glassfish-batch-connector [103](R 103.0): + String module = message.substring(index, index2); + + // Remove the duplicate number + if (module.contains("(R")) { + module = module.substring(0, module.indexOf("(R")); + } + + printLn(messageBuilder, indent, module); + printLn(messageBuilder, indent, "missing requirement"); + + index = index2 + "missing requirement".length(); + + // In GlassFish and in a classloader the search is always for package, so we can + // use that as a delimiter here + int indexPackage = message.indexOf("osgi.wiring.package; ", index); + int indexHost = message.indexOf("osgi.wiring.host; ", index); + + boolean hasPackage = indexPackage >= 0; + boolean hasHost = indexHost >= 0; + + boolean isPackage = false; + if (hasPackage && (!hasHost || indexPackage < indexHost)) { + index = indexPackage; + isPackage = true; + } else if (hasHost) { + index = indexHost; + } else { + index = -1; + } + + if (index >= 0) { + + indent++; + + if (isPackage) { + + // Remainder of input now looks like this: + + // osgi.wiring.package; (&(osgi.wiring.package=org.glassfish.grizzly)(version>=2.4.0)(!(version>=3.0.0))) + + // Skip over "osgi.wiring.package; ", we're always searching for this so + // no need to print it. + index += "osgi.wiring.package; ".length(); + + // Now extracting this: + // "(&(osgi.wiring.package=org.glassfish.grizzly)(version>=2.4.0)(!(version>=3.0.0)))" + index2 = message.indexOf(" ", index); + + String packageAndVersion = null; + if (index2 != -1) { + packageAndVersion = message.substring(index, index2); + } else { + packageAndVersion = message.substring(index); + } + + // Make it a little less "cramped" + // "(&(package=org.glassfish.grizzly) (version>=2.4.0) (!(version>=3.0.0)))" + packageAndVersion = packageAndVersion.replace("osgi.wiring.package", "package"); + packageAndVersion = packageAndVersion.replace(")(", ") ("); + packageAndVersion = packageAndVersion.replace("=", " = "); + packageAndVersion = packageAndVersion.replace("> =", " >="); + packageAndVersion = packageAndVersion.replace("< =", " <="); + + // Remove outer braces + // "&(package=org.glassfish.grizzly) (version>=2.4.0) (!(version>=3.0.0))" + if (packageAndVersion.startsWith("(")) { + packageAndVersion = packageAndVersion.substring(1); + } + if (packageAndVersion.endsWith(")")) { + packageAndVersion = packageAndVersion.substring(0, packageAndVersion.length() - 1); + } + + printLn(messageBuilder, indent, packageAndVersion); + } else { + + // Remainder of input now looks like this: + + // osgi.wiring.host; (&(osgi.wiring.host=org.hibernate.validator)(bundle-version>=0.0.0) + + // Skip over "osgi.wiring.host; ", we're already searching for this so + // no need to print it. + index += "osgi.wiring.host; ".length(); + + index2 = message.indexOf("]", index); + + String remainder = null; + if (index2 != -1) { + remainder = message.substring(index, index2); + } else { + remainder = message.substring(index); + } + + printLn(messageBuilder, indent, remainder); + } + + // If there's a "caused by:", print it and increase the indent + index = message.indexOf("caused by: ", index2); + if (index >= 0) { + + printLn(messageBuilder, indent, "caused by:"); + + indent++; + index += "caused by: ".length(); + } + + } + } + + if (index2 == -1) { + index = -1; + } else { + index = index2; + index = message.indexOf("Unable to resolve", index); + } + } + return messageBuilder.toString(); + } catch (Exception e) { + // Usually we are processing another exception - if we failed, better return original. + return message; + } + } + + public static String addBundleInfo(Bundle bundle, String prettyMessage) { + final StringBuilder bundleBuilder = new StringBuilder(1024); + bundleBuilder.append("\n").append(prettyMessage); + if (bundle != null) { + bundleBuilder.append('[').append(bundle.getBundleId()).append("] \n"); + bundleBuilder.append("jar = ").append(bundle.getLocation()); + tryAddPomProperties(bundle, bundleBuilder); + bundleBuilder.append('\n'); + } + + return bundleBuilder.toString(); + } + + private static List<Long> addExportingBundles(BundleContext context, String prettyMessage, StringBuilder bundleBuilder) { + Set<Bundle> exportingBundles = new HashSet<>(); + List<Long> bundleIDs = new ArrayList<>(); + + int lastPackageindex = prettyMessage.lastIndexOf("package = "); + if (lastPackageindex != -1) { + String lastPackage = prettyMessage.substring(lastPackageindex + "package = ".length(), prettyMessage.indexOf(")", lastPackageindex)); + + exportingBundles.addAll(findExporters(context, lastPackage)); + + if (exportingBundles.isEmpty()) { + bundleBuilder.append("\nNo bundles found to export " + lastPackage + "\n"); + } else { + bundleBuilder.append("\nThe following bundles export \"" + lastPackage + "\"\n"); + for (Bundle bundle : exportingBundles) { + bundleIDs.add(bundle.getBundleId()); + + bundleBuilder.append(bundle.getSymbolicName()) + .append(" ") + .append(bundle.getVersion()) + .append(" [") + .append(bundle.getBundleId()) + .append("]") + .append("\n") + ; + } + } + bundleBuilder.append("\n"); + } + + return bundleIDs; + } + + private static List<Bundle> findExporters(BundleContext ctx, String packageName) { + List<Bundle> exporters = new ArrayList<>(); + + for (Bundle b : ctx.getBundles()) { + BundleRevision rev = b.adapt(BundleRevision.class); + if (rev == null) { + continue; + } + + List<Capability> caps = rev.getCapabilities(PACKAGE_NAMESPACE); + for (Capability cap : caps) { + Map<String, Object> attrs = cap.getAttributes(); + Object exportedPkg = attrs.get(PACKAGE_NAMESPACE); + + if (packageName.equals(exportedPkg)) { + exporters.add(b); + break; // one match is enough per bundle + } + } + } + + return exporters; + } + + private static void tryAddPomProperties(Bundle bundle, StringBuilder bundleBuilder) { + Enumeration<URL> entries = bundle.findEntries("META-INF/maven/", "pom.properties", true); + if (entries == null) { + return; + } + + while (entries.hasMoreElements()) { + try (BufferedReader reader = new BufferedReader(new InputStreamReader(entries.nextElement().openStream(), UTF_8))) { + reader.lines() + .filter(e -> !e.startsWith("#")) + .forEach(e -> bundleBuilder.append('\n').append(e.replace("=", " = "))); + } catch (IOException e1) { + // Ignore + } + bundleBuilder.append('\n'); + } + } + + + /** + * @param message - error message from the exception + * @return list of bundle ids (are in square brackets in the message) + */ + public static List<Long> findBundleIds(final String message) { + if (message == null || message.isEmpty()) { + return Collections.emptyList(); + } + Set<Long> bundleIds = new LinkedHashSet<>(); + Matcher bundlePattern = BUNDLE_PATTERN.matcher(message); + while (bundlePattern.find()) { + String number = bundlePattern.group(1); + bundleIds.add(Long.valueOf(number)); + } + return new ArrayList<>(bundleIds); + } + + + private static void printLn(StringBuilder messageBuilder, int indent, String message) { + for (int i = 0; i < (indent * 4); i++) { + messageBuilder.append(" "); + } + messageBuilder.append(message.trim()).append("\n"); + } +}
diff --git a/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/OSGiModuleImpl.java b/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/OSGiModuleImpl.java index ae8b55c..d88addc 100755 --- a/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/OSGiModuleImpl.java +++ b/osgi/adapter/src/main/java/org/jvnet/hk2/osgiadapter/OSGiModuleImpl.java
@@ -17,15 +17,12 @@ package org.jvnet.hk2.osgiadapter; +import static org.jvnet.hk2.osgiadapter.FelixPrettyPrinter.prettyPrintFelixMessage; import static org.jvnet.hk2.osgiadapter.Logger.logger; import java.io.*; import java.net.URI; import java.net.URL; -import java.security.AccessController; -import java.security.PrivilegedAction; -import java.security.PrivilegedActionException; -import java.security.PrivilegedExceptionAction; import java.util.*; import java.util.concurrent.locks.ReentrantLock; import java.util.logging.Level; @@ -177,29 +174,16 @@ return; } try { - SecurityManager sm = System.getSecurityManager(); - if (sm != null) { - try { - AccessController.doPrivileged(new PrivilegedExceptionAction(){ - public Object run() throws BundleException - { - startBundle(); - return null; - } - }); - } catch (PrivilegedActionException e) { - throw (BundleException)e.getException(); - } - } else { - startBundle(); - } + startBundle(); isTransientlyActive = true; if (logger.isLoggable(Level.FINE)) { logger.logp(Level.FINE, "OSGiModuleImpl", "start", "Started bundle {0}", bundle); } } catch (BundleException e) { - throw new ResolveError("Failed to start "+this,e); + throw new ResolveError( + "Failed to start " + this + prettyPrintFelixMessage(registry.getBundleContext(), e.getMessage()), + e); } // TODO(Sahoo): Remove this when hk2-apt generates equivalent BundleActivator @@ -298,6 +282,7 @@ } } + @Override public void detach() { if (bundle.getState() != Bundle.ACTIVE) { if (logger.isLoggable(Level.FINER)) { @@ -400,7 +385,7 @@ /** * Parses all the inhabitants descriptors of the given name in this module. - * @return + * @return */ List<ActiveDescriptor> parseInhabitants(String name, ServiceLocator serviceLocator, List<PopulatorPostProcessor> populatorPostProcessors) throws IOException, BootException { @@ -414,7 +399,7 @@ dff = new URLDescriptorFileFinder(entry); } - + if (dff != null) { final OSGiModuleImpl module = this; @@ -426,7 +411,7 @@ } this.activeDescriptors = HK2Populator.populate(serviceLocator, dff, allPostProcessors); } - + return this.activeDescriptors; } @@ -434,11 +419,7 @@ * This method is used as the parent loader of the class loader that we return in {@link #getClassLoader} */ private ClassLoader getParentLoader() { - return AccessController.doPrivileged(new PrivilegedAction<ClassLoader>() { - public ClassLoader run() { - return Bundle.class.getClassLoader(); - } - }); + return Bundle.class.getClassLoader(); } @Override @@ -457,20 +438,10 @@ return new ClassLoader(getParentLoader()) { private final ReentrantLock lock = new ReentrantLock(); @Override - protected Class<?> loadClass(final String name, boolean resolve) throws ClassNotFoundException { + protected Class<?> loadClass(final String name, boolean resolve) throws ClassNotFoundException { lock.lock(); try { - //doprivileged needed for running with SecurityManager - return AccessController.doPrivileged(new PrivilegedExceptionAction<Class>() { - public Class run() throws ClassNotFoundException { - - Class c = bundle.loadClass(name); - - return c; - } - }); - } catch (PrivilegedActionException e) { - throw (ClassNotFoundException)e.getException(); + return bundle.loadClass(name); } finally { lock.unlock(); } @@ -480,7 +451,7 @@ @Override public URL getResource(String name) { URL result = bundle.getResource(name); - + if (result != null) return result; return null; } @@ -589,11 +560,11 @@ "] is already associated with bundle [" + this.bundle + "]"); } else { this.bundle = bundle; - + logger.logp(Level.INFO, "OSGiModuleImpl", "setBundle", "module [{0}] is now associated with bundle [{1}]", new Object[]{this, bundle}); } } - + }
diff --git a/pom.xml b/pom.xml index 8d57aae..3676d11 100644 --- a/pom.xml +++ b/pom.xml
@@ -1,7 +1,7 @@ <?xml version="1.0" encoding="UTF-8"?> <!-- - Copyright (c) 2022, 2025 Contributors to Eclipse Foundation. + Copyright (c) 2022, 2026 Contributors to Eclipse Foundation. Copyright (c) 2020, 2021 Payara Services Ltd. Copyright (c) 2010, 2020 Oracle and/or its affiliates. All rights reserved. @@ -31,7 +31,7 @@ <groupId>org.glassfish.hk2</groupId> <artifactId>hk2-parent</artifactId> - <version>3.1.2-SNAPSHOT</version> + <version>4.0.0-SNAPSHOT</version> <packaging>pom</packaging> <name>GlassFish HK2</name> @@ -145,17 +145,21 @@ <project.build.outputTimestamp>2023-10-04T08:38:05Z</project.build.outputTimestamp> <jakarta.activation.version>2.1.4</jakarta.activation.version> - <jakarta.annotation.version>2.1.1</jakarta.annotation.version> + <jakarta.annotation.version>3.0.0-M1</jakarta.annotation.version> + <jakarta.enterprise.cdi-api.version>4.1.0</jakarta.enterprise.cdi-api.version> + <jakarta.servlet.version>6.1.0</jakarta.servlet.version> <jakarta.json.version>2.1.3</jakarta.json.version> + <jakarta.validation.version>3.1.0</jakarta.validation.version> + <jakarta.ws.rs.version>4.0.0</jakarta.ws.rs.version> + <jakarta.el.version>6.0.0</jakarta.el.version> + <parsson.version>1.1.7</parsson.version> <jaxb-api.version>4.0.5</jaxb-api.version> <jaxb-runtime.version>4.0.6</jaxb-runtime.version> - <java.net.username>${user.name}</java.net.username> - <jakarta.enterprise.cdi-api.version>4.1.0</jakarta.enterprise.cdi-api.version> <hibernate-validator.version>8.0.3.Final</hibernate-validator.version> - <jakarta.validation.version>3.1.1</jakarta.validation.version> + <glassfish.jakarta.el.version>4.0.2</glassfish.jakarta.el.version> - <jakarta.el.version>5.0.1</jakarta.el.version> + <jtype.version>0.1.3</jtype.version> <javassist.version>3.30.2-GA</javassist.version> <junit.version>4.13.2</junit.version> @@ -163,7 +167,7 @@ <woodstox.version>4.1.2</woodstox.version> <stax-api.version>1.0-2</stax-api.version> <aopalliance.version>1.0</aopalliance.version> - <testng.version>7.12.0</testng.version> + <testng.version>7.12.2</testng.version> <assertj.version>3.27.7</assertj.version> <pax-exam-version>4.14.0</pax-exam-version> <jakarta-inject.version>2.0.1</jakarta-inject.version> @@ -171,10 +175,8 @@ <jersey.version>3.1.11</jersey.version> <grizzly.version>4.0.2</grizzly.version> <hamcrest.version>1.3</hamcrest.version> - <jakarta.servlet.version>6.0.0</jakarta.servlet.version> - <jakarta.ws.rs.version>3.1.0</jakarta.ws.rs.version> <classmate.version>1.7.3</classmate.version> - <springcontext.version>5.3.39</springcontext.version> + <springcontext.version>6.1.10</springcontext.version> <guice.version>7.0.0</guice.version> <protobuf.version>3.25.8</protobuf.version> @@ -186,8 +188,6 @@ <release.arguments /> <manifest.location>target/classes/META-INF/MANIFEST.MF</manifest.location> - - <activate.securitymanager></activate.securitymanager> </properties> <dependencyManagement> @@ -788,6 +788,7 @@ <java.util.logging.config.file>logging.properties</java.util.logging.config.file> <net.bytebuddy.experimental>true</net.bytebuddy.experimental> </systemPropertyVariables> + <rerunFailingTestsCount>3</rerunFailingTestsCount> </configuration> </plugin> <plugin> @@ -950,4 +951,4 @@ </build> </profile> </profiles> -</project> +</project> \ No newline at end of file