diff --git a/.github/workflows/tests-code.yml b/.github/workflows/tests-code.yml
index f3da550b0b4..cd2e130de80 100644
--- a/.github/workflows/tests-code.yml
+++ b/.github/workflows/tests-code.yml
@@ -576,6 +576,7 @@ jobs:
echo "//SOURCES ../../$f" >> "${{ matrix.script }}"
fi
done
+ - run: cat ${{ matrix.script }}
- run: jbang build "${{ matrix.script }}"
shell: bash
- run: jbang "${{ matrix.script }}" --help
diff --git a/.jbang/JabKitLauncher.java b/.jbang/JabKitLauncher.java
index a3313e0d344..2418e689221 100755
--- a/.jbang/JabKitLauncher.java
+++ b/.jbang/JabKitLauncher.java
@@ -30,6 +30,10 @@
//DEPS io.github.darvil82:terminal-text-formatter:2.3.0c
//DEPS info.picocli:picocli:4.7.7
//DEPS com.github.ben-manes.caffeine:caffeine:3.2.3
+//DEPS com.fasterxml.jackson.core:jackson-annotations:2.20
+//DEPS tools.jackson.core:jackson-core:3.0.2
+//DEPS tools.jackson.core:jackson-databind:3.0.2
+//DEPS tools.jackson.dataformat:jackson-dataformat-yaml:3.0.2
/// This class is required for [jbang](https://www.jbang.dev/)
public class JabKitLauncher {
diff --git a/.jbang/JabLsLauncher.java b/.jbang/JabLsLauncher.java
index 0ee1cac48b1..a932c78f973 100755
--- a/.jbang/JabLsLauncher.java
+++ b/.jbang/JabLsLauncher.java
@@ -36,7 +36,10 @@
//DEPS org.jspecify:jspecify:1.0.0
// from jabls
-//DEPS com.fasterxml.jackson.core:jackson-databind:2.20.1
+//DEPS com.fasterxml.jackson.core:jackson-annotations:2.20
+//DEPS tools.jackson.core:jackson-core:3.0.2
+//DEPS tools.jackson.core:jackson-databind:3.0.2
+//DEPS tools.jackson.dataformat:jackson-dataformat-yaml:3.0.2
//DEPS info.picocli:picocli:4.7.7
//DEPS org.apache.logging.log4j:log4j-to-slf4j:2.25.2
//DEPS org.eclipse.lsp4j:org.eclipse.lsp4j:0.24.0
diff --git a/.jbang/JabSrvLauncher.java b/.jbang/JabSrvLauncher.java
index f00ed51a273..081696065ba 100755
--- a/.jbang/JabSrvLauncher.java
+++ b/.jbang/JabSrvLauncher.java
@@ -80,6 +80,9 @@
//DEPS net.harawata:appdirs:1.5.0
//DEPS de.undercouch:citeproc-java:3.4.0
//DEPS com.github.ben-manes.caffeine:caffeine:3.2.3
+//DEPS tools.jackson.core:jackson-core:3.0.2
+//DEPS tools.jackson.core:jackson-databind:3.0.2
+//DEPS tools.jackson.dataformat:jackson-dataformat-yaml:3.0.2
//DEPS org.apache.commons:commons-lang3:3.19.0
/// This class is required for [jbang](https://www.jbang.dev/)
diff --git a/jablib-examples/jbang/ieee_pdf_references_to_bibtex.java b/jablib-examples/jbang/ieee_pdf_references_to_bibtex.java
index 71a0d45f932..3e5493c07e9 100644
--- a/jablib-examples/jbang/ieee_pdf_references_to_bibtex.java
+++ b/jablib-examples/jbang/ieee_pdf_references_to_bibtex.java
@@ -18,6 +18,10 @@
//DEPS org.jabref:jablib:6.0-SNAPSHOT
// JabRef relies on PR https://github.com/unicode-org/icu/pull/2127; for experiments the release version is OK.
//DEPS com.ibm.icu:icu4j:78.1
+//DEPS com.fasterxml.jackson.core:jackson-annotations:2.20
+//DEPS tools.jackson.core:jackson-core:3.0.2
+//DEPS tools.jackson.core:jackson-databind:3.0.2
+//DEPS tools.jackson.dataformat:jackson-dataformat-yaml:3.0.2
void main() throws Exception {
var preferences = JabRefCliPreferences.getInstance();
diff --git a/jablib/build.gradle.kts b/jablib/build.gradle.kts
index 7b6e2ebb643..7c239a8bb45 100644
--- a/jablib/build.gradle.kts
+++ b/jablib/build.gradle.kts
@@ -103,8 +103,8 @@ dependencies {
implementation("org.eclipse.jgit:org.eclipse.jgit")
- implementation("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml")
- implementation("com.fasterxml.jackson.datatype:jackson-datatype-jsr310")
+ implementation("tools.jackson.dataformat:jackson-dataformat-yaml")
+ implementation("tools.jackson.core:jackson-databind")
// TODO: Somwewhere we get a warning: unknown enum constant Id.CLASS reason: class file for com.fasterxml.jackson.annotation.JsonTypeInfo$Id not found
// implementation("com.fasterxml.jackson.core:jackson-annotations:2.19.1")
diff --git a/jablib/src/main/java/module-info.java b/jablib/src/main/java/module-info.java
index f6b15121e93..8553c370c77 100644
--- a/jablib/src/main/java/module-info.java
+++ b/jablib/src/main/java/module-info.java
@@ -155,9 +155,9 @@
// region: data mapping
requires jdk.xml.dom;
requires com.google.gson;
- requires com.fasterxml.jackson.databind;
- requires com.fasterxml.jackson.dataformat.yaml;
- requires com.fasterxml.jackson.datatype.jsr310;
+ requires tools.jackson.databind;
+ requires tools.jackson.dataformat.yaml;
+ requires tools.jackson.core;
// endregion
// region HTTP clients
diff --git a/jablib/src/main/java/org/jabref/logic/citationstyle/CSLStyleLoader.java b/jablib/src/main/java/org/jabref/logic/citationstyle/CSLStyleLoader.java
index ad033541604..c40b075e43c 100644
--- a/jablib/src/main/java/org/jabref/logic/citationstyle/CSLStyleLoader.java
+++ b/jablib/src/main/java/org/jabref/logic/citationstyle/CSLStyleLoader.java
@@ -9,12 +9,12 @@
import org.jabref.logic.openoffice.OpenOfficePreferences;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.ObjectMapper;
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import tools.jackson.core.type.TypeReference;
+import tools.jackson.databind.ObjectMapper;
/**
* Manages the loading of CitationStyles from both internal resources and external files.
diff --git a/jablib/src/main/java/org/jabref/logic/crawler/StudyYamlParser.java b/jablib/src/main/java/org/jabref/logic/crawler/StudyYamlParser.java
index b3906d9815b..fa496c77a39 100644
--- a/jablib/src/main/java/org/jabref/logic/crawler/StudyYamlParser.java
+++ b/jablib/src/main/java/org/jabref/logic/crawler/StudyYamlParser.java
@@ -7,9 +7,10 @@
import org.jabref.model.study.Study;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
-import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.dataformat.yaml.YAMLFactory;
+import tools.jackson.dataformat.yaml.YAMLMapper;
+import tools.jackson.dataformat.yaml.YAMLWriteFeature;
/**
* Example use: new StudyYamlParser().parseStudyYamlFile(studyDefinitionFile);
@@ -30,8 +31,10 @@ public Study parseStudyYamlFile(Path studyYamlFile) throws IOException {
* Writes the given study instance into a yaml file to the given path
*/
public void writeStudyYamlFile(Study study, Path studyYamlFile) throws IOException {
- ObjectMapper yamlMapper = new ObjectMapper(new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER)
- .enable(YAMLGenerator.Feature.MINIMIZE_QUOTES));
+
+ ObjectMapper yamlMapper = new YAMLMapper(YAMLFactory.builder()
+ .disable(YAMLWriteFeature.WRITE_DOC_START_MARKER)
+ .enable(YAMLWriteFeature.MINIMIZE_QUOTES).build());
yamlMapper.writeValue(studyYamlFile.toFile(), study);
}
}
diff --git a/jablib/src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java b/jablib/src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java
index f5597769384..442e91b0737 100644
--- a/jablib/src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java
+++ b/jablib/src/main/java/org/jabref/logic/importer/fileformat/CffImporter.java
@@ -26,10 +26,12 @@
import com.fasterxml.jackson.annotation.JsonAnySetter;
import com.fasterxml.jackson.annotation.JsonProperty;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.google.common.collect.HashBiMap;
import org.jspecify.annotations.NonNull;
+import tools.jackson.core.JacksonException;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.dataformat.yaml.YAMLFactory;
+import tools.jackson.dataformat.yaml.YAMLMapper;
public class CffImporter extends Importer {
@@ -171,7 +173,7 @@ private void setValues(String key, String value) {
@Override
public ParserResult importDatabase(@NonNull BufferedReader reader) throws IOException {
- ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+ ObjectMapper mapper = new YAMLMapper(new YAMLFactory());
CffFormat citation = mapper.readValue(reader, CffFormat.class);
List entriesList = new ArrayList<>();
@@ -263,14 +265,13 @@ public ParserResult importDatabase(@NonNull BufferedReader reader) throws IOExce
@Override
public boolean isRecognizedFormat(@NonNull BufferedReader reader) throws IOException {
-
- ObjectMapper mapper = new ObjectMapper(new YAMLFactory());
+ ObjectMapper mapper = new YAMLMapper(new YAMLFactory());
CffFormat citation;
try {
citation = mapper.readValue(reader, CffFormat.class);
return (citation != null) && (citation.values.get("title") != null);
- } catch (IOException e) {
+ } catch (JacksonException e) {
return false;
}
}
diff --git a/jablib/src/main/java/org/jabref/logic/util/MscCodeUtils.java b/jablib/src/main/java/org/jabref/logic/util/MscCodeUtils.java
index eb44743d653..a26636bdbe9 100644
--- a/jablib/src/main/java/org/jabref/logic/util/MscCodeUtils.java
+++ b/jablib/src/main/java/org/jabref/logic/util/MscCodeUtils.java
@@ -7,14 +7,15 @@
import org.jabref.logic.shared.exception.MscCodeLoadingException;
-import com.fasterxml.jackson.core.JsonParseException;
-import com.fasterxml.jackson.core.type.TypeReference;
-import com.fasterxml.jackson.databind.JsonMappingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.common.collect.HashBiMap;
import org.jspecify.annotations.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
+import tools.jackson.core.exc.StreamReadException;
+import tools.jackson.core.type.TypeReference;
+import tools.jackson.databind.DatabindException;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.json.JsonMapper;
public class MscCodeUtils {
private static final Logger LOGGER = LoggerFactory.getLogger(MscCodeUtils.class);
@@ -29,10 +30,10 @@ public class MscCodeUtils {
@NonNull
public static Optional> loadMscCodesFromJson(URL resourceUrl) throws MscCodeLoadingException {
- ObjectMapper mapper = new ObjectMapper();
+ ObjectMapper mapper = new JsonMapper();
try {
Map mapping =
- mapper.readValue(resourceUrl, new TypeReference<>() {
+ mapper.readValue(resourceUrl.openStream(), new TypeReference<>() {
});
HashBiMap result = HashBiMap.create(mapping);
@@ -41,7 +42,7 @@ public static Optional> loadMscCodesFromJson(URL resou
}
return Optional.of(result);
- } catch (JsonParseException | JsonMappingException e) {
+ } catch (StreamReadException | DatabindException e) {
LOGGER.error("Error parsing MSC codes from JSON", e);
throw new MscCodeLoadingException("Failed to parse MSC codes from JSON", e);
} catch (IOException e) {
diff --git a/jabls/src/main/java/module-info.java b/jabls/src/main/java/module-info.java
index c77e579b0a8..8c85dcfae0d 100644
--- a/jabls/src/main/java/module-info.java
+++ b/jabls/src/main/java/module-info.java
@@ -6,7 +6,7 @@
requires org.jabref.jablib;
- requires com.fasterxml.jackson.databind;
+ requires tools.jackson.databind;
requires com.google.common;
requires com.google.gson;
diff --git a/jabls/src/main/java/org/jabref/languageserver/ExtensionSettings.java b/jabls/src/main/java/org/jabref/languageserver/ExtensionSettings.java
index d03c068d7ab..0bdab1922e8 100644
--- a/jabls/src/main/java/org/jabref/languageserver/ExtensionSettings.java
+++ b/jabls/src/main/java/org/jabref/languageserver/ExtensionSettings.java
@@ -1,10 +1,11 @@
package org.jabref.languageserver;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
import com.google.gson.JsonObject;
import org.slf4j.Logger;
+import tools.jackson.core.JacksonException;
+import tools.jackson.databind.JsonNode;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.json.JsonMapper;
public class ExtensionSettings {
@@ -29,7 +30,7 @@ public static ExtensionSettings getDefaultSettings() {
}
public void copyFromJsonObject(JsonObject object) {
- ObjectMapper mapper = new ObjectMapper();
+ ObjectMapper mapper = new JsonMapper();
try {
JsonNode node = mapper.readTree(object.toString());
this.consistencyCheck = node.at("/jabref/consistencyCheck/enabled").asBoolean(this.consistencyCheck);
@@ -37,7 +38,7 @@ public void copyFromJsonObject(JsonObject object) {
this.consistencyCheckOptional = node.at("/jabref/consistencyCheck/optional").asBoolean(this.consistencyCheckOptional);
this.consistencyCheckUnknown = node.at("/jabref/consistencyCheck/unknown").asBoolean(this.consistencyCheckUnknown);
this.integrityCheck = node.at("/jabref/integrityCheck/enabled").asBoolean(this.integrityCheck);
- } catch (JsonProcessingException processingException) {
+ } catch (JacksonException processingException) {
LOGGER.error("Error parsing settings from JSON", processingException);
}
}
diff --git a/jabsrv/src/main/java/module-info.java b/jabsrv/src/main/java/module-info.java
index b94c17b39c8..dbd50de52fc 100644
--- a/jabsrv/src/main/java/module-info.java
+++ b/jabsrv/src/main/java/module-info.java
@@ -10,7 +10,7 @@
exports org.jabref.http.server.command to jersey.server;
opens org.jabref.http.server.cayw to com.google.gson, org.glassfish.hk2.locator, org.glassfish.hk2.utilities;
opens org.jabref.http.dto to com.google.gson;
- opens org.jabref.http.server.command to com.google.gson, org.glassfish.hk2.locator, org.glassfish.hk2.utilities, com.fasterxml.jackson.databind;
+ opens org.jabref.http.server.command to com.google.gson, org.glassfish.hk2.locator, org.glassfish.hk2.utilities, tools.jackson.databind;
exports org.jabref.http.server.services;
exports org.jabref.http;
opens org.jabref.http.server.resources to org.glassfish.hk2.locator, org.glassfish.hk2.utilities;
@@ -58,6 +58,5 @@
requires java.logging;
requires jersey.container.grizzly2.http;
requires jersey.server;
- requires com.fasterxml.jackson.annotation;
- requires com.fasterxml.jackson.databind;
+ requires tools.jackson.databind;
}
diff --git a/jabsrv/src/main/java/org/jabref/http/server/command/CommandResource.java b/jabsrv/src/main/java/org/jabref/http/server/command/CommandResource.java
index 410cb328292..7dfb074e224 100644
--- a/jabsrv/src/main/java/org/jabref/http/server/command/CommandResource.java
+++ b/jabsrv/src/main/java/org/jabref/http/server/command/CommandResource.java
@@ -1,7 +1,5 @@
package org.jabref.http.server.command;
-import com.fasterxml.jackson.core.JsonProcessingException;
-import com.fasterxml.jackson.databind.ObjectMapper;
import jakarta.inject.Inject;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.POST;
@@ -10,6 +8,9 @@
import jakarta.ws.rs.core.MediaType;
import jakarta.ws.rs.core.Response;
import org.glassfish.hk2.api.ServiceLocator;
+import tools.jackson.core.JacksonException;
+import tools.jackson.databind.ObjectMapper;
+import tools.jackson.databind.json.JsonMapper;
@Path("commands")
public class CommandResource {
@@ -21,13 +22,13 @@ public class CommandResource {
@Consumes({MediaType.APPLICATION_JSON})
@Produces({MediaType.APPLICATION_JSON})
public Response dispatchCommand(String jsonCommand) {
- ObjectMapper objectMapper = new ObjectMapper();
+ ObjectMapper objectMapper = new JsonMapper();
try {
Command command = objectMapper.readValue(jsonCommand, Command.class);
command.setServiceLocator(serviceLocator);
return command.execute();
- } catch (JsonProcessingException e) {
+ } catch (JacksonException e) {
return Response.serverError().entity(e.getMessage()).build();
}
}
diff --git a/versions/build.gradle.kts b/versions/build.gradle.kts
index f4977a27d50..06655e1d3db 100644
--- a/versions/build.gradle.kts
+++ b/versions/build.gradle.kts
@@ -32,6 +32,10 @@ dependencies {
api("org.junit.jupiter:junit-jupiter")
api("org.junit.platform:junit-platform-launcher")
+ api(platform("tools.jackson:jackson-bom:3.0.2"))
+ api("tools.jackson.core:jackson-core")
+ api("tools.jackson.core:jackson-databind")
+ api("tools.jackson.dataformat:jackson-dataformat-yaml")
}
dependencies.constraints {
@@ -47,8 +51,6 @@ dependencies.constraints {
api("com.dlsc.gemsfx:gemsfx:3.6.2")
api("com.dlsc.pdfviewfx:pdfviewfx:3.3.2")
api("com.ibm.icu:icu4j:72.0.1!!")
- api("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.20.1")
- api("com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.20.1")
api("com.fasterxml:aalto-xml:1.3.4")
api("org.eclipse.lsp4j:org.eclipse.lsp4j:0.24.0")
api("org.eclipse.lsp4j:org.eclipse.lsp4j.websocket:0.24.0")