diff --git a/build.gradle b/build.gradle index efb9af2f..4e048304 100644 --- a/build.gradle +++ b/build.gradle @@ -1,10 +1,8 @@ -import java.awt.GraphicsEnvironment - plugins { id 'application' - id 'extra-java-module-info' id 'org-openjfx-javafxplugin' id 'org.beryx.jlink' version '3.0.1' + id 'org.gradlex.extra-java-module-info' version '1.9' } def sparrowVersion = '2.0.1' @@ -96,15 +94,27 @@ dependencies { implementation("com.github.sarxos:webcam-capture${targetName}:0.3.13-SNAPSHOT") { exclude group: 'com.nativelibs4java', module: 'bridj' } - implementation "io.matthewnelson.kotlin-components:kmp-tor:${vTor}-${vKmpTor}" - if(kmpOs == "linux" && kmpArch == "arm64") { - implementation("com.sparrowwallet.kmp-tor-binary:kmp-tor-binary-${kmpOs}${kmpArch}-jvm:${vTor}") - } else { - implementation("io.matthewnelson.kotlin-components:kmp-tor-binary-${kmpOs}${kmpArch}:${vTor}") + implementation("io.matthewnelson.kotlin-components:kmp-tor:${vTor}-${vKmpTor}") { + exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-common' + } + if(kmpOs == "linux" && kmpArch == "arm64") { + implementation("com.sparrowwallet.kmp-tor-binary:kmp-tor-binary-${kmpOs}${kmpArch}-jvm:${vTor}") { + exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-common' + } + } else { + implementation("io.matthewnelson.kotlin-components:kmp-tor-binary-${kmpOs}${kmpArch}:${vTor}") { + exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-common' + } + } + implementation("io.matthewnelson.kotlin-components:kmp-tor-binary-extract:${vTor}") { + exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-common' + } + implementation("io.matthewnelson.kotlin-components:kmp-tor-ext-callback-manager:${vKmpTor}") { + exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-common' + } + implementation('org.jetbrains.kotlinx:kotlinx-coroutines-javafx:1.7.1') { + exclude group: 'org.jetbrains.kotlin', module: 'kotlin-stdlib-common' } - implementation("io.matthewnelson.kotlin-components:kmp-tor-binary-extract:${vTor}") - implementation("io.matthewnelson.kotlin-components:kmp-tor-ext-callback-manager:${vKmpTor}") - implementation('org.jetbrains.kotlinx:kotlinx-coroutines-javafx:1.7.1') implementation('de.codecentric.centerdevice:centerdevice-nsmenufx:2.1.7') implementation('org.controlsfx:controlsfx:11.1.0' ) { exclude group: 'org.openjfx', module: 'javafx-base' @@ -323,55 +333,6 @@ task packageTarDistribution(type: Tar) { } extraJavaModuleInfo { - module('jackson-core-2.17.2.jar', 'com.fasterxml.jackson.core', '2.17.2') { - exports('com.fasterxml.jackson.core') - exports('com.fasterxml.jackson.core.async') - exports('com.fasterxml.jackson.core.base') - exports('com.fasterxml.jackson.core.exc') - exports('com.fasterxml.jackson.core.filter') - exports('com.fasterxml.jackson.core.format') - exports('com.fasterxml.jackson.core.io') - exports('com.fasterxml.jackson.core.json') - exports('com.fasterxml.jackson.core.json.async') - exports('com.fasterxml.jackson.core.sym') - exports('com.fasterxml.jackson.core.type') - exports('com.fasterxml.jackson.core.util') - uses('com.fasterxml.jackson.core.ObjectCodec') - } - module('jackson-annotations-2.17.2.jar', 'com.fasterxml.jackson.annotation', '2.17.2') { - requires('com.fasterxml.jackson.core') - exports('com.fasterxml.jackson.annotation') - } - module('jackson-databind-2.17.2.jar', 'com.fasterxml.jackson.databind', '2.17.2') { - requires('java.desktop') - requires('java.logging') - requires('com.fasterxml.jackson.annotation') - requires('com.fasterxml.jackson.core') - requires('java.sql') - requires('java.xml') - exports('com.fasterxml.jackson.databind') - exports('com.fasterxml.jackson.databind.annotation') - exports('com.fasterxml.jackson.databind.cfg') - exports('com.fasterxml.jackson.databind.deser') - exports('com.fasterxml.jackson.databind.deser.impl') - exports('com.fasterxml.jackson.databind.deser.std') - exports('com.fasterxml.jackson.databind.exc') - exports('com.fasterxml.jackson.databind.ext') - exports('com.fasterxml.jackson.databind.introspect') - exports('com.fasterxml.jackson.databind.json') - exports('com.fasterxml.jackson.databind.jsonFormatVisitors') - exports('com.fasterxml.jackson.databind.jsonschema') - exports('com.fasterxml.jackson.databind.jsontype') - exports('com.fasterxml.jackson.databind.jsontype.impl') - exports('com.fasterxml.jackson.databind.module') - exports('com.fasterxml.jackson.databind.node') - exports('com.fasterxml.jackson.databind.ser') - exports('com.fasterxml.jackson.databind.ser.impl') - exports('com.fasterxml.jackson.databind.ser.std') - exports('com.fasterxml.jackson.databind.type') - exports('com.fasterxml.jackson.databind.util') - uses('com.fasterxml.jackson.databind.Module') - } module('tornadofx-controls-1.0.4.jar', 'tornadofx.controls', '1.0.4') { exports('tornadofx.control') requires('javafx.controls') @@ -421,13 +382,6 @@ extraJavaModuleInfo { module('javacsv-2.0.jar', 'net.sourceforge.javacsv', '2.0') { exports('com.csvreader') } - module('jeromq-0.5.0.jar', 'jeromq', '0.5.0') { - exports('org.zeromq') - } - module('json-simple-1.1.1.jar', 'json.simple', '1.1.1') { - exports('org.json.simple') - exports('org.json.simple.parser') - } module('listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar', 'com.google.guava.listenablefuture', '9999.0-empty-to-avoid-conflict-with-guava') module('jsr305-3.0.2.jar', 'com.google.code.findbugs.jsr305', '3.0.2') module('j2objc-annotations-2.8.jar', 'com.google.j2objc.j2objc.annotations', '2.8') @@ -491,7 +445,6 @@ extraJavaModuleInfo { exports('org.flywaydb.core.api.exception') exports('org.flywaydb.core.api.configuration') uses('org.flywaydb.core.extensibility.Plugin') - provides('org.flywaydb.core.extensibility.Plugin', 'org.flywaydb.core.internal.database.h2.H2DatabaseType', 'org.flywaydb.core.internal.schemahistory.BaseAppliedMigration', 'org.flywaydb.core.internal.resource.CoreResourceTypeProvider') requires('java.sql') } module('wellbehavedfx-0.3.3.jar', 'org.fxmisc.wellbehaved', '0.3.3') { @@ -504,49 +457,16 @@ extraJavaModuleInfo { exports('co.nstant.in.cbor.model') exports('co.nstant.in.cbor.builder') } - module('commons-codec-1.10.jar', 'commons.codec', '1.10') { - exports('org.apache.commons.codec') - } - module('logback-core-1.2.13.jar', 'ch.qos.logback.core', '1.2.13') { - exports('ch.qos.logback.core') - } - module('jackson-datatype-jsr310-2.13.2.jar', 'jackson-datatype-jsr310', '2.13.2') { - exports('com.fasterxml.jackson.datatype.jsr310') - } - module('json-20240205.jar', 'org.json', '20240205') { - exports('org.json') - } - module('scrypt-1.4.0.jar', 'scrypt', '1.4.0') { - exports('com.lambdaworks.codec') - exports('com.lambdaworks.crypto') - } - module('okio-1.6.0.jar', 'com.squareup.okio', '1.6.0') { - exports('okio') - } - module('java-jwt-3.8.1.jar', 'com.auth0.jwt', '3.8.1') { - exports('com.auth0.jwt') - } module('streamsupport-1.7.0.jar', 'net.sourceforge.streamsupport', '1.7.0') { requires('jdk.unsupported') exports('java8.util') exports('java8.util.function') exports('java8.util.stream') } - module('commons-text-1.2.jar', 'org.apache.commons.text', '1.2') { - exports('org.apache.commons.text') - } - module('jcip-annotations-1.0.jar', 'net.jcip.annotations', '1.0') { - exports('net.jcip.annotations') - } module('thumbnailator-0.4.18.jar', 'net.coobird.thumbnailator', '0.4.18') { exports('net.coobird.thumbnailator') requires('java.desktop') } - module('fxsvgimage-1.1.jar', 'com.github.hervegirod', '1.1') { - exports('org.girod.javafx.svgimage') - requires('javafx.graphics') - requires('java.xml') - } module("kmp-tor-jvm-${vKmpTor}.jar", 'kmp.tor.jvm', "${vTor}-${vKmpTor}") { exports('io.matthewnelson.kmp.tor') requires('kmp.tor.binary.extract.jvm') @@ -660,7 +580,6 @@ extraJavaModuleInfo { module("parcelize-jvm-0.1.2.jar", 'parcelize.jvm', "0.1.2") { exports('io.matthewnelson.component.parcelize') } - module('jnacl-1.0.0.jar', 'eu.neilalexander.jnacl', '1.0.0') module('jcommander-2.0.jar', 'org.jcommander', '2.0') { exports('com.beust.jcommander') } diff --git a/buildSrc/build.gradle b/buildSrc/build.gradle index 35f31961..8cf7a830 100644 --- a/buildSrc/build.gradle +++ b/buildSrc/build.gradle @@ -5,7 +5,6 @@ plugins { dependencies { implementation 'com.google.gradle:osdetector-gradle-plugin:1.7.3' implementation 'org.javamodularity:moduleplugin:1.8.14' - implementation 'org.ow2.asm:asm:9.6' } repositories { @@ -17,11 +16,6 @@ repositories { gradlePlugin { plugins { - // here we register our plugin with an ID - register("extra-java-module-info") { - id = "extra-java-module-info" - implementationClass = "org.gradle.sample.transform.javamodules.ExtraModuleInfoPlugin" - } register("org-openjfx-javafxplugin") { id = "org-openjfx-javafxplugin" implementationClass = "org.openjfx.gradle.JavaFXPlugin" diff --git a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPlugin.java b/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPlugin.java deleted file mode 100644 index 48d0b0b2..00000000 --- a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPlugin.java +++ /dev/null @@ -1,54 +0,0 @@ -package org.gradle.sample.transform.javamodules; - -import org.gradle.api.Plugin; -import org.gradle.api.Project; -import org.gradle.api.artifacts.Configuration; -import org.gradle.api.attributes.Attribute; -import org.gradle.api.plugins.JavaPlugin; - -/** - * Entry point of our plugin that should be applied in the root project. - */ -public class ExtraModuleInfoPlugin implements Plugin { - - @Override - public void apply(Project project) { - // register the plugin extension as 'extraJavaModuleInfo {}' configuration block - ExtraModuleInfoPluginExtension extension = project.getObjects().newInstance(ExtraModuleInfoPluginExtension.class); - project.getExtensions().add(ExtraModuleInfoPluginExtension.class, "extraJavaModuleInfo", extension); - - // setup the transform for all projects in the build - project.getPlugins().withType(JavaPlugin.class).configureEach(javaPlugin -> configureTransform(project, extension)); - } - - private void configureTransform(Project project, ExtraModuleInfoPluginExtension extension) { - Attribute artifactType = Attribute.of("artifactType", String.class); - Attribute javaModule = Attribute.of("javaModule", Boolean.class); - - // compile and runtime classpath express that they only accept modules by requesting the javaModule=true attribute - project.getConfigurations().matching(this::isResolvingJavaPluginConfiguration).all( - c -> c.getAttributes().attribute(javaModule, true)); - - // all Jars have a javaModule=false attribute by default; the transform also recognizes modules and returns them without modification - project.getDependencies().getArtifactTypes().getByName("jar").getAttributes().attribute(javaModule, false); - - // register the transform for Jars and "javaModule=false -> javaModule=true"; the plugin extension object fills the input parameter - project.getDependencies().registerTransform(ExtraModuleInfoTransform.class, t -> { - t.parameters(p -> { - p.setModuleInfo(extension.getModuleInfo()); - p.setAutomaticModules(extension.getAutomaticModules()); - }); - t.getFrom().attribute(artifactType, "jar").attribute(javaModule, false); - t.getTo().attribute(artifactType, "jar").attribute(javaModule, true); - }); - } - - private boolean isResolvingJavaPluginConfiguration(Configuration configuration) { - if (!configuration.isCanBeResolved()) { - return false; - } - return configuration.getName().endsWith(JavaPlugin.COMPILE_CLASSPATH_CONFIGURATION_NAME.substring(1)) - || configuration.getName().endsWith(JavaPlugin.RUNTIME_CLASSPATH_CONFIGURATION_NAME.substring(1)) - || configuration.getName().endsWith(JavaPlugin.ANNOTATION_PROCESSOR_CONFIGURATION_NAME.substring(1)); - } -} diff --git a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPluginExtension.java b/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPluginExtension.java deleted file mode 100644 index d0d4e0fd..00000000 --- a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoPluginExtension.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.gradle.sample.transform.javamodules; - - -import org.gradle.api.Action; - -import javax.annotation.Nullable; -import java.util.HashMap; -import java.util.Map; - -/** - * A data class to collect all the module information we want to add. - * Here the class is used as extension that can be configured in the build script - * and as input to the ExtraModuleInfoTransform that add the information to Jars. - */ -public class ExtraModuleInfoPluginExtension { - - private final Map moduleInfo = new HashMap<>(); - private final Map automaticModules = new HashMap<>(); - - /** - * Add full module information for a given Jar file. - */ - public void module(String jarName, String moduleName, String moduleVersion) { - module(jarName, moduleName, moduleVersion, null); - } - - /** - * Add full module information, including exported packages and dependencies, for a given Jar file. - */ - public void module(String jarName, String moduleName, String moduleVersion, @Nullable Action conf) { - ModuleInfo moduleInfo = new ModuleInfo(moduleName, moduleVersion); - if (conf != null) { - conf.execute(moduleInfo); - } - this.moduleInfo.put(jarName, moduleInfo); - } - - /** - * Add only an automatic module name to a given jar file. - */ - public void automaticModule(String jarName, String moduleName) { - automaticModules.put(jarName, moduleName); - } - - protected Map getModuleInfo() { - return moduleInfo; - } - - protected Map getAutomaticModules() { - return automaticModules; - } -} diff --git a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoTransform.java b/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoTransform.java deleted file mode 100644 index 0a93bec8..00000000 --- a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ExtraModuleInfoTransform.java +++ /dev/null @@ -1,181 +0,0 @@ -package org.gradle.sample.transform.javamodules; - -import org.gradle.api.artifacts.transform.InputArtifact; -import org.gradle.api.artifacts.transform.TransformAction; -import org.gradle.api.artifacts.transform.TransformOutputs; -import org.gradle.api.artifacts.transform.TransformParameters; -import org.gradle.api.file.FileSystemLocation; -import org.gradle.api.provider.Provider; -import org.gradle.api.tasks.Input; -import org.objectweb.asm.ClassWriter; -import org.objectweb.asm.ModuleVisitor; -import org.objectweb.asm.Opcodes; - -import java.io.*; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.jar.*; -import java.util.regex.Pattern; -import java.util.zip.ZipEntry; - -/** - * An artifact transform that applies additional information to Jars without module information. - * The transformation fails the build if a Jar does not contain information and no extra information - * was defined for it. This way we make sure that all Jars are turned into modules. - */ -abstract public class ExtraModuleInfoTransform implements TransformAction { - - public static class Parameter implements TransformParameters, Serializable { - private Map moduleInfo = Collections.emptyMap(); - private Map automaticModules = Collections.emptyMap(); - - @Input - public Map getModuleInfo() { - return moduleInfo; - } - - @Input - public Map getAutomaticModules() { - return automaticModules; - } - - public void setModuleInfo(Map moduleInfo) { - this.moduleInfo = moduleInfo; - } - - public void setAutomaticModules(Map automaticModules) { - this.automaticModules = automaticModules; - } - } - - @InputArtifact - protected abstract Provider getInputArtifact(); - - @Override - public void transform(TransformOutputs outputs) { - Map moduleInfo = getParameters().moduleInfo; - Map automaticModules = getParameters().automaticModules; - File originalJar = getInputArtifact().get().getAsFile(); - String originalJarName = originalJar.getName(); - - //Recreate jackson jars as open, non-synthetic modules - if ((isModule(originalJar) && !originalJarName.contains("jackson")) || originalJarName.startsWith("javafx-")) { - outputs.file(originalJar); - } else if (moduleInfo.containsKey(originalJarName)) { - addModuleDescriptor(originalJar, getModuleJar(outputs, originalJar), moduleInfo.get(originalJarName)); - } else if (isAutoModule(originalJar)) { - outputs.file(originalJar); - } else if (automaticModules.containsKey(originalJarName)) { - addAutomaticModuleName(originalJar, getModuleJar(outputs, originalJar), automaticModules.get(originalJarName)); - } else if(originalJarName.startsWith("kotlin-stdlib-common")) { - //ignore - } else { - throw new RuntimeException("Not a module and no mapping defined: " + originalJarName); - } - } - - private boolean isModule(File jar) { - Pattern moduleInfoClassMrjarPath = Pattern.compile("META-INF/versions/\\d+/module-info.class"); - try (JarInputStream inputStream = new JarInputStream(new FileInputStream(jar))) { - boolean isMultiReleaseJar = containsMultiReleaseJarEntry(inputStream); - ZipEntry next = inputStream.getNextEntry(); - while (next != null) { - if ("module-info.class".equals(next.getName())) { - return true; - } - if (isMultiReleaseJar && moduleInfoClassMrjarPath.matcher(next.getName()).matches()) { - return true; - } - next = inputStream.getNextEntry(); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - return false; - } - - private boolean containsMultiReleaseJarEntry(JarInputStream jarStream) { - Manifest manifest = jarStream.getManifest(); - return manifest != null && Boolean.parseBoolean(manifest.getMainAttributes().getValue("Multi-Release")); - } - - private boolean isAutoModule(File jar) { - try (JarInputStream inputStream = new JarInputStream(new FileInputStream(jar))) { - return inputStream.getManifest().getMainAttributes().getValue("Automatic-Module-Name") != null; - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private File getModuleJar(TransformOutputs outputs, File originalJar) { - return outputs.file(originalJar.getName().substring(0, originalJar.getName().lastIndexOf('.')) + "-module.jar"); - } - - private static void addAutomaticModuleName(File originalJar, File moduleJar, String moduleName) { - try (JarInputStream inputStream = new JarInputStream(new FileInputStream(originalJar))) { - Manifest manifest = inputStream.getManifest(); - manifest.getMainAttributes().put(new Attributes.Name("Automatic-Module-Name"), moduleName); - try (JarOutputStream outputStream = new JarOutputStream(new FileOutputStream(moduleJar), inputStream.getManifest())) { - copyEntries(inputStream, outputStream); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private static void addModuleDescriptor(File originalJar, File moduleJar, ModuleInfo moduleInfo) { - try (JarInputStream inputStream = new JarInputStream(new FileInputStream(originalJar))) { - Manifest manifest = inputStream.getManifest(); - if(manifest == null) { - manifest = new Manifest(); - } - try (JarOutputStream outputStream = new JarOutputStream(new FileOutputStream(moduleJar), manifest)) { - copyEntries(inputStream, outputStream); - outputStream.putNextEntry(new JarEntry("module-info.class")); - outputStream.write(addModuleInfo(moduleInfo)); - outputStream.closeEntry(); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private static void copyEntries(JarInputStream inputStream, JarOutputStream outputStream) throws IOException { - JarEntry jarEntry = inputStream.getNextJarEntry(); - while (jarEntry != null) { - if(!jarEntry.getName().equals("module-info.class")) { - outputStream.putNextEntry(jarEntry); - outputStream.write(inputStream.readAllBytes()); - outputStream.closeEntry(); - } - jarEntry = inputStream.getNextJarEntry(); - } - } - - private static byte[] addModuleInfo(ModuleInfo moduleInfo) { - ClassWriter classWriter = new ClassWriter(0); - classWriter.visit(Opcodes.V9, Opcodes.ACC_MODULE, "module-info", null, null, null); - ModuleVisitor moduleVisitor = classWriter.visitModule(moduleInfo.getModuleName(), Opcodes.ACC_OPEN, moduleInfo.getModuleVersion()); - for (String packageName : moduleInfo.getExports()) { - moduleVisitor.visitExport(packageName.replace('.', '/'), 0); - } - moduleVisitor.visitRequire("java.base", 0, null); - for (String requireName : moduleInfo.getRequires()) { - moduleVisitor.visitRequire(requireName, 0, null); - } - for (String requireName : moduleInfo.getRequiresTransitive()) { - moduleVisitor.visitRequire(requireName, Opcodes.ACC_TRANSITIVE, null); - } - for (String usesName : moduleInfo.getUses()) { - moduleVisitor.visitUse(usesName.replace('.', '/')); - } - for (Map.Entry> providesEntry : moduleInfo.getProvides().entrySet()) { - moduleVisitor.visitProvide(providesEntry.getKey().replace('.', '/'), - providesEntry.getValue().stream().map(name -> name.replace('.', '/')).toArray(String[]::new)); - } - moduleVisitor.visitEnd(); - classWriter.visitEnd(); - return classWriter.toByteArray(); - } -} diff --git a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ModuleInfo.java b/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ModuleInfo.java deleted file mode 100644 index 167a5e8c..00000000 --- a/buildSrc/src/main/java/org/gradle/sample/transform/javamodules/ModuleInfo.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.gradle.sample.transform.javamodules; - -import java.io.Serializable; -import java.util.*; - -/** - * Data class to hold the information that should be added as module-info.class to an existing Jar file. - */ -public class ModuleInfo implements Serializable { - private String moduleName; - private String moduleVersion; - private List exports = new ArrayList<>(); - private List requires = new ArrayList<>(); - private List requiresTransitive = new ArrayList<>(); - private List uses = new ArrayList<>(); - private Map> provides = new LinkedHashMap<>(); - - ModuleInfo(String moduleName, String moduleVersion) { - this.moduleName = moduleName; - this.moduleVersion = moduleVersion; - } - - public void exports(String exports) { - this.exports.add(exports); - } - - public void requires(String requires) { - this.requires.add(requires); - } - - public void requiresTransitive(String requiresTransitive) { - this.requiresTransitive.add(requiresTransitive); - } - - public void uses(String uses) { - this.uses.add(uses); - } - - public void provides(String service, String... providers) { - this.provides.put(service, Arrays.asList(providers)); - } - - public String getModuleName() { - return moduleName; - } - - protected String getModuleVersion() { - return moduleVersion; - } - - protected List getExports() { - return exports; - } - - protected List getRequires() { - return requires; - } - - protected List getRequiresTransitive() { - return requiresTransitive; - } - - protected List getUses() { - return uses; - } - - public Map> getProvides() { - return provides; - } -} diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index b4b0cafc..0e97b69b 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -59,7 +59,7 @@ open module com.sparrowwallet.sparrow { requires com.github.librepdf.openpdf; requires com.googlecode.lanterna; requires net.coobird.thumbnailator; - requires com.github.hervegirod; + requires org.girod.javafx.svgimage; requires com.sparrowwallet.toucan; requires com.sparrowwallet.bokmakierie; requires java.smartcardio;