-
-
Notifications
You must be signed in to change notification settings - Fork 489
Geonetwork on Spring 6 codesprint June 2023
- Jose
- Francois
The main goal of this sprint is to evaluate the update of GeoNetwork to Java 11, Java 17, identify issues, and try to limit the number of critical security vulnerabilities that can be fixed by library updates.
- Java 11 runtime tests
- Java 17 runtime tests
- Spring 5 and hibernate 5 update
- Spring 6 and hibernate 6 evaluation
Based on https://github.com/geonetwork/core-geonetwork/pull/6276, the application is starting up with:
mvn jetty:run
- from the release build
- from Intellij
Failed to startup in Intellij while using maven 3.8.1. Fixed with maven 3.8.7.
One runtime issue identified:
- Metrics
getOpenFileDescriptorCount
is failing on API call http://localhost:8080/geonetwork/monitor/metrics?pretty=true
HTTP ERROR 500 java.lang.reflect.InaccessibleObjectException:
Unable to make public long
com.sun.management.internal.OperatingSystemImpl.getOpenFileDescriptorCount() accessible:
module jdk.management does not "opens com.sun.management.internal"
to unnamed module @4f7f59dd
Fixed by
--add-opens jdk.management/com.sun.management.internal=ALL-UNNAMED
GeoNetwork on Java 11 looks to be usable. Question:
- Do we keep the possibility to build with Java 8 ? or we just move to Java 11 and add a warning if Java >11.
- Raise an error if > Java11 ?
This type of issue is related to the fact that JDK17 does not provide illegal-access
option and the default is like JDK11 --illegal-access=deny
- java.lang
module java.base does not "opens java.lang" to unnamed module
fixed by
--add-opens java.base/java.lang=ALL-UNNAMED
- javax.annotation
Error creating bean with name 'translationPackBuilder' defined in file
[classes/org/fao/geonet/api/tools/i18n/TranslationPackBuilder.class]:
Post-processing of merged bean definition failed; nested exception is
java.lang.NoSuchMethodError: 'java.lang.String javax.annotation.Resource.lookup()'
Moving to jakarta EE9+ as done by Spring 6+
Tested with https://docs.openrewrite.org/recipes/java/migrate/jakarta/javaxannotationmigrationtojakartaannotation:
mvn -U org.openrewrite.maven:rewrite-maven-plugin:run \
-Drewrite.recipeArtifactCoordinates=org.openrewrite.recipe:rewrite-migrate-java:RELEASE \
-Drewrite.activeRecipes=org.openrewrite.java.migrate.jakarta.JavaxAnnotationMigrationToJakartaAnnotation
From the release
java.lang.NoClassDefFoundError: Could not initialize class org.codehaus.groovy.vmplugin.v7.Java7
?
In order to run on Java 17+, Spring 6 migration is required (and Spring 6 requires Java 17 and Jakarta EE9).
So it probably means that GeoNetwork will then require at least (to be confirmed):
- maven 3.8.7+
- Java 17
- Tomcat 10
- Jetty 11 and also require that all dependencies used also moved to Jakarta EE9, Spring 6
Update to latest version:
- Spring, Hibernate 5
- Jetty 9
Branch https://github.com/geonetwork/core-geonetwork/tree/lib-spring5
Questions:
- GN 4.4.0 ?
- Java 8 and 11 or only 11 support ?
- Need for warning message when running Java >11 ?
- Doc update (JVM config, max version of Jetty/Tomcat)
Evaluate Spring 6 migration.
Related documents:
- https://github.com/spring-projects/spring-framework/wiki/Upgrading-to-Spring-Framework-6.x
- https://spring.io/blog/2022/11/16/spring-framework-6-0-goes-ga
"Spring Framework 6 and Spring Boot 3 based applications will require a minimum of JDK 17 at runtime, as well as a minimum of Tomcat 10 / Jetty 11"
At build time, libraries to add/update:
- Spring
- Hibernate Validator 8.0
- Hibernate ORM 6.3 moved to Jakarta https://hibernate.atlassian.net/browse/HHH-16563?
- Jakarta EE9 javax.annotation > jakarta.annotation, javax.servlet imports to jakarta.servlet jql=project%20%3D%20HHH%20AND%20component%20%3D%20hibernate-jpamodelgen
- Password stored in database / EncryptedStringType not supported by jasypt https://github.com/jasypt/jasypt/issues/147. Alternative https://thorben-janssen.com/how-to-use-jpa-type-converter-to/ ?
- Cache / Ehcache 2 to 3 migration https://www.ehcache.org/documentation/3.10/migration-guide.html and https://docs.jboss.org/hibernate/orm/6.2/userguide/html_single/Hibernate_User_Guide.html#caching-provider-jcache-cache-manager
- Java / ReadOnlyMvcInterceptor / Something to remove?
- Java / ServiceManager / Jetty dependency on EofException
- Java / MailUtil / use jakarta.mail.* / Any alternative?
- Spring security / Check openid (getClientRegistration), keycloak (todo), cas (changed to apero instead of casig)
- Wro4J / No support for Spring6 https://github.com/wro4j/wro4j/issues/1135
- HTTP Proxy / Jakarta migration in progress https://github.com/mitre/HTTP-Proxy-Servlet/pull/238#issuecomment-1563728877
- Camel / https://camel.apache.org/blog/2022/05/camel317-whatsnew/
- Jetty on maven plugin/deps/docker
- ...
Branch https://github.com/fxprunayre/core-geonetwork/tree/lib-spring6
[WARNING] The POM for com.sun.xml.bind:jaxb-impl:jar:2.2.11 is invalid, transitive dependencies (if any) will not be available, enable debug logging for more details
One goal is to also update libraries which have CRITICIAL vulnerabilities reported.
- Check github security alerts
- Trivy
export GNPATH=/core-geonetwork
cd $GNPATH
docker pull aquasec/trivy:latest
docker run -v $PWD:$GNPATH aquasec/trivy fs --cache-dir $GNPATH/.trivycache/ --download-java-db-only
docker run -v $PWD:$GNPATH aquasec/trivy fs --cache-dir $GNPATH/.trivycache/ --download-db-only
docker run -v $PWD:$GNPATH aquasec/trivy \
rootfs --cache-dir $GNPATH/.trivycache/ \
--vuln-type library --skip-db-update --scanners vuln --severity CRITICAL \
$GNPATH/web/target/geonetwork
# Scanning docker image
docker run -v $PWD:/core-geonetwork aquasec/trivy image --cache-dir /core-geonetwork/.trivycache/ --vuln-type library --skip-db-update --scanners vuln --severity HIGH,CRITICAL geonetwork:4.2.4
Some libraries like JCloud and ES High level client depend on snakeyml
version 1.2.6 that has vulnerabilities.
snakeyaml
org.springdoc:springdoc-openapi-common
https://mvnrepository.com/artifact/org.springdoc/springdoc-openapi-common/1.7.0
Forcing the dependency to version 2.0, it builds and apparently it doesn't cause issues. But in the changes list, are indicated some backwards incompatible changes, that are hard to say if the related code is used: https://bitbucket.org/snakeyaml/snakeyaml/wiki/Changes
<dependency>
<groupId>org.yaml</groupId>
<artifactId>snakeyaml</artifactId>
<version>2.0</version>
</dependency>
Apparently, new versions of ES doesn't depend on that library, but doesn't provide the ES High Level Client. The code requires to be changed to use the elasticsearch-rest-client
.
For JCloud data storage should be checked if an upgrade is possible that depends on snakeyaml
version 2.0 or to move it to a custom module, that is build on demand. As most GeoNetwork instalations doesn't require this feature (same strategy can be applied for CMIS and S3 storages).
org.mapfish.print:print-lib (print-lib-2.2.0.jar)
Vulnerability report was wrongly targeting version 2. The vulnerability only affects version 3. Vulnerability report https://github.com/mapfish/mapfish-print/security/advisories/GHSA-vjv6-gq77-3mjw updated with the minimum version affected. Trivy java db not yet updated ?
org.springframework:spring-web (spring-web-5.3.27.jar)
See
- https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-1000027
- https://github.com/spring-projects/spring-framework/blob/v5.3.27/src/docs/asciidoc/integration.adoc#remoting-httpinvoker
Does not apply to GeoNetwork configuration.
org.jyaml:jyaml (jyaml-1.3.jar)
https://mvnrepository.com/artifact/org.jyaml/jyaml
= No more recent version available
org.apache.cxf:cxf-core (cxf-core-3.0.12.jar)
OpenCMIS https://mvnrepository.com/artifact/org.apache.chemistry.opencmis/chemistry-opencmis-client-api
= No more recent version available
= Add a module to exclude CMIS from build?
- GeoNetwork Java 11 PR https://github.com/geonetwork/core-geonetwork/pull/6276
- geOrchestra PR https://github.com/georchestra/geonetwork/pull/191
If you have some comments, start a discussion, raise an issue or use one of our other communication channels to talk to us.