错误:“模块'foo.bar'中声明包为'javafx.beans.value'”

时间:2018-11-11 12:28:19

标签: java java-module jigsaw java-11 javafx-11

我开发了一个module-info.java如下的库:

module foo.bar {
  requires org.apache.commons.lang3;
  requires javafx.base;
  requires java.validation;
  exports foo.bar;
}

此库用于module-info.java包含以下内容的另一个项目:

module other.project {
  requires org.apache.commons.lang3;
  requires javafx.base;
  requires javafx.graphics;
  requires javafx.fxml;
  requires foo.bar;
}

当我尝试使用import javafx.beans.value.WritableValue;时出现错误

  

javafx.beans.valuefoo.bar中声明,但不声明   将其导出到模块other.project

更新:我创建了两个示例项目来重现该问题。请找到它们here进行下载。

我不明白为什么会这样,但是我找不到解决办法。

1 个答案:

答案 0 :(得分:2)

基于发布的项目here,您打开项目时遇到的错误是:

  

包'javafx.beans.property'在模块'com.example.external.lib'中声明,该模块不会将其导出到模块'example.project'

此错误的原因是您将javafx.base中的某些程序包添加到了外部库中,但这些程序包未导出到使用该库的项目中。 javafx.beans.property软件包由外部模块在内部使用,但无法导出

因此,这是一些建议的更改,以使其正常工作。

如果要创建模块化jar(使用module-info类作为另一个项目的依赖项,则不需要使用影子插件,也不需要 bundle < / em> jars中的JavaFX依赖项。

  1. 外部图书馆项目

因此您可以拥有相同的module-info.java文件:

module com.example.external.lib {
    requires javafx.base;
    requires org.apache.commons.lang3;

    exports com.example.external.library;
}

带有这样的build.gradle

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.0'
    }
}

apply plugin: 'com.google.osdetector'
apply plugin: 'java'

ext.platform = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os

sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    compile 'org.apache.commons:commons-lang3:3.8.1'
    compile "org.openjfx:javafx-base:11:$platform"
}

compileJava {
    doFirst {
        options.compilerArgs = [
                '--module-path', classpath.asPath,
                '--add-modules', 'javafx.base'
        ]
    }
}

现在,当您运行gradle build时,将生成一个{2KB的jar,libs/external-library.jar,没有JavaFX依赖项。

请注意,如果您仍想对该外部项目进行影子jar,则可以使用compileOnly "org.openjfx:javafx-base:11:$platform"将JavaFX依赖项排除在此jar外。

  1. Project-using-external-lib

您可以将该jar添加到项目中。

build.gradle

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.0'
    }
}

apply plugin: 'com.google.osdetector'
apply plugin: 'java'

ext.platform = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os

sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    compile files('libs/external-library.jar')
    compile 'org.apache.commons:commons-lang3:3.8.1'
    compile "org.openjfx:javafx-base:11:$platform"
}

compileJava {
    doFirst {
        options.compilerArgs = [
                '--module-path', classpath.asPath,
                '--add-modules', 'javafx.base'
        ]
    }
}

但是现在您的module-info文件应该再次包含javafx.base依赖项:

module example.project {
    requires javafx.base;
    requires com.example.external.lib;

    exports com.example.project;
}

您可以运行gradle build来生成一个jar,IntelliJ将不再抱怨。

如果您想在最后放一个影子罐,也可以申请:

buildscript {
    repositories {
        mavenCentral()
        maven {
            url "https://plugins.gradle.org/m2/"
        }
    }
    dependencies {
        classpath 'com.google.gradle:osdetector-gradle-plugin:1.6.0'
    }
}

apply plugin: 'application'
apply plugin: 'com.google.osdetector'

ext.platform = osdetector.os == 'osx' ? 'mac' : osdetector.os == 'windows' ? 'win' : osdetector.os

sourceCompatibility = JavaVersion.VERSION_11
targetCompatibility = JavaVersion.VERSION_11

repositories {
    mavenCentral()
}

dependencies {
    compile files('libs/external-library.jar')
    compile 'org.apache.commons:commons-lang3:3.8.1'
    compile "org.openjfx:javafx-base:11:$platform"
}

compileJava {
    doFirst {
        options.compilerArgs = [
                '--module-path', classpath.asPath,
                '--add-modules', 'javafx.base'
        ]
    }
}

run {
    doFirst {
        jvmArgs = [
                '--module-path', classpath.asPath,
                '--add-modules', 'javafx.base'
        ]
    }
}

mainClassName = "com.example.project.PublicClass"

jar {
    manifest {
        attributes 'Main-Class': 'com.example.project.PublicClass'
    }
    from {
        configurations.compile.collect { it.isDirectory() ? it : zipTree(it) }
    }
}

,因此您将能够运行java -jar build/libs/project-using-external-lib.jar。请注意,此jar将包含JavaFX类。

不建议使用阴影罐来分发项目,但是由于您具有自动模块(commons-lang3),因此除非您将其转换为显式模块,否则不能使用jlink(请参见此answer)。