我的项目使用 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
这是一个基于 gradle 的解决方案,它使用来自 gradlex-org/extra-java-module-info 的 extra-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;
}