如何将带有拆分包的非模块化 JAR 添加到 Intellij idea 中的模块化 JavaFX 项目中?

问题描述 投票:0回答:1

我的项目使用 Mapsforge 库来显示地图,并使用 JavaFX 来显示 GUI。
有一种方法可以使用

javafx-maven-plugin
编译 JavaFX 并保持非模块化范例,但这似乎违背了最佳实践。 问题是 mapsforge 有拆分包
org.mapsforge.map.rendertheme
可以从
mapsforge.map
mapsforge.themes
模块访问,这使得在模块信息中不可能同时需要它们:

java: java.lang.reflect.InvocationTargetException
Modules mapsforge.map and mapsforge.themes export package org.mapsforge.map.rendertheme to module org.postgresql.jdbc

在阅读了类似问题的答案后,我意识到您可以将库作为 JAR 添加到类路径中,但不能作为模块依赖项添加。问题是 - 你如何在 Intellij 中正确地做到这一点?

我将三个mapsforge jar 放入ROOT/lib 文件夹中,并将它们全部添加为项目库。 我也试过

Modules -> Dependencies -> Add Jars or Libraries

问题是我仍然无法引用这些罐子中的类:

java: package org.mapsforge.core.graphics is not visible (package org.mapsforge.core.graphics is declared in the unnamed module, but module rfinder does not read it)

如何使带有外部 jar 的未命名模块对

rfinder
可见?

PS: 我使用maven,面向maven的解决方案是最好的,但我不知道如何将maven包添加到classpath

intellij-idea java-module mapsforge java-package
1个回答
0
投票

这是一个基于 gradle 的解决方案,它使用来自 gradlex-org/extra-java-module-infoextra-java-module-info

插件

该插件提供了

mergeJar()
函数,可用于组合分成两个 jar 的包,如
mapsforge.map
mapsforge.themes

build.gradle

// build.gradle script for mapsforge libraries
// - Modularize the mapsforge jar files and dependencies
// - Merge mapsforge.map and mapsforge.themes to fix
//   split package
plugins {
    id 'application'
    id 'org.gradlex.extra-java-module-info' version '1.8'
}

extraJavaModuleInfo {
    module("mapsforge-core-0.21.0.jar", "mapsforge.core","0.21.0"){
        exportAllPackages()

        requires("java.logging")
    }
    module("mapsforge-map-0.21.0.jar", "mapsforge.map","0.21.0"){

        // Merge mapsforge.themes to avoid split package
        mergeJar("org.mapsforge:mapsforge-themes")

        exportAllPackages()

        requires("mapsforge.core")
        requires("java.logging")
        requires("kxml2")

    }
    module("mapsforge-map-awt-0.21.0.jar", "mapsforge.map.awt","0.21.0"){
        exportAllPackages()

        requires("mapsforge.map")
        requires("mapsforge.core")

        requires("svgSalamander")
        requires("java.desktop")
    }
    module("mapsforge-map-reader-0.21.0.jar", "mapsforge.map.reader","0.21.0"){
        exportAllPackages()

        requires("mapsforge.core")
        requires("mapsforge.map")
        requires("java.logging")
    }
    module("svgSalamander-1.1.3.jar", "com.kitfox.svg","1.1.3"){
        exportAllPackages()
        requires("java.desktop")
    }
    module("kxml2-2.3.0.jar", "kxml2", "2.3.0"){
        exportAllPackages()
        exports("org.xmlpull.v1")
    }
}

repositories {
    mavenCentral()
}

dependencies {
    implementation 'org.mapsforge:mapsforge-core:0.21.0'
    implementation 'org.mapsforge:mapsforge-map:0.21.0'
    implementation 'org.mapsforge:mapsforge-map-awt:0.21.0'
    implementation 'org.mapsforge:mapsforge-map-reader:0.21.0'
    implementation 'org.mapsforge:mapsforge-themes:0.21.0'

    // mapsforge dependencies
    implementation group: 'net.sf.kxml', name: 'kxml2', version: '2.3.0'
    implementation group: 'com.formdev', name: 'svgSalamander', version: '1.1.3'

    // Use JUnit Jupiter for testing.
    testImplementation libs.junit.jupiter
    testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
}

application {
    // Define the main class for the application.
    mainClass = 'org.example.MapDev'
}

distTar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
distZip { duplicatesStrategy = DuplicatesStrategy.EXCLUDE }

ext.moduleName = 'mapmerge.app'

该插件在

extraJavaModuleInfo {...}
块内运行。应用于每个非模块化 jar 的转换在
module(...)
函数中指定。
mergeJar("org.mapsforge:mapsforge-themes")
操作将
mapsforge.themes
内容复制到
mapsforge.map
jar 中。

关联的

module-info.java
文件如下所示:

module mapmerge.app {
    exports edu.jhuapl.aos.anps.map;

    requires mapsforge.core;
    requires mapsforge.map.reader;
    requires mapsforge.map;
    requires mapsforge.map.awt;
    //requires mapsforge.themes;  // Don't need, now in mapsforge.map

    requires java.desktop;
}
© www.soinside.com 2019 - 2024. All rights reserved.