- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
从IDEA 2018.2.1开始,IDE将启动突出显示错误的软件包
在模块图中”(来自已模块化的依赖项)。我向项目中添加了module-info.java
文件,并添加了
必需的requires
语句,但是我现在无法访问
我的src/main/resources
目录中的资源文件。
(有关完整示例,请参见this GitHub project。)
当我使用./gradlew run
或./gradlew installDist
+结果时
包装脚本,我能够读取资源文件,但是当我运行我的
应用程序从IDE,不是。
我提交了issue
使用JetBrains,我了解到IDEA正在使用该模块
路径,而Gradle默认情况下使用的是classpath。通过增加
我的build.gradle
的以下块,我能够获得Gradle
到也到…无法读取任何资源文件。
run {
inputs.property("moduleName", moduleName)
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--module', "$moduleName/$mainClassName"
]
classpath = files()
}
}
export
-将我感兴趣的资源目录
error: package is empty or does not exist: mydir
opens
而不是
exports
遇到了相同的错误
mydir
资源目录移到
src/main/java
下,
build
目录。
file:///
URL读取资源(可能甚至没有),
build.gradle
中添加了以下内容:
// at compile time, put resources in same directories as classes
sourceSets {
main.output.resourcesDir = main.java.outputDir
}
// at compile time, include resources in module
compileJava {
inputs.property("moduleName", moduleName)
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
'--patch-module', "$moduleName="
+ files(sourceSets.main.resources.srcDirs).asPath,
'--module-version', "$moduleVersion"
]
classpath = files()
}
}
// at run time, make Gradle use the module path
run {
inputs.property("moduleName", moduleName)
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--module', "$moduleName/$mainClassName"
]
classpath = files()
}
}
run
任务针对JAR执行,现在尝试在运行任务
throws an InputStream
中读取资源目录
IOException
而不是提供文件列表。 (针对JAR,它只是获得一个空的
InputStream
。)
最佳答案
更新(2020年3月25日):在适当的JPMS支持方面已经取得了重大进展。每晚构建的Gradle 6.4现在包含使用Java 9模块本地开发的选项。参见https://github.com/gradle/gradle/issues/890#issuecomment-603289940。
更新(2020年9月29日):自Gradle 6.4(此更新的当前版本为6.6.1)以来,您现在可以在Gradle项目中本地支持JPMS模块,但您必须显式激活此功能:
java {
modularity.inferModulePath.set(true)
}
有关更多信息,请参阅Gradle的
Java Modules Sample,该链接还链接到其他各种相关文档。
One of the most exciting features of Java 9 is its support for developing and deploying modular Java software. Gradle doesn’t have first-class support for Java 9 modules yet.
Some community plugins, like java9-modularity plugin, attempt to add support. This guide will be updated with more information on how to use built-in Gradle support when it is developed.
jlink
工具的支持。
build/
|--classes/
|--resources/
classes
目录是放置
module-info.class
文件的位置。这会导致模块系统出现问题,因为从技术上讲,
resources
目录下的文件不包括在
classes
目录中存在的模块内。当使用类路径而不是模块路径时这不是问题,因为模块系统将整个类路径视为一个巨型模块(即所谓的未命名模块)。
opens
指令,则在运行时会出现错误。错误的原因是由于上述目录布局,软件包在模块中不存在。出于相同的原因,在编译时会收到警告。该模块位于
src/main/java
中,并且
src/main/resources
下的资源文件在技术上不包括在该模块中。
.java
或
.class
扩展名的软件包。
opens
指令。仅当需要使其他模块可以访问资源时,才需要为包含资源的软件包添加此类指令,因为模块中的资源受
encapsulation约束。
A resource in a named module may be encapsulated so that it cannot be located by code in other modules. Whether a resource can be located or not is determined as follows:
- If the resource name ends with "
.class
" then it is not encapsulated.- A package name is derived from the resource name. If the package name is a package in the module then the resource can only be located by the caller of this method when the package is open to at least the caller's module. If the resource is not in a package in the module then the resource is not encapsulated.
plugins {
id("org.javamodularity.moduleplugin") version "..."
}
您也可以 checkout
other available plugins。
run
任务以使用资源目录修补模块。这是一个示例(Kotlin DSL):
plugins {
application
}
group = "..."
version = "..."
java {
sourceCompatibility = JavaVersion.VERSION_13
}
application {
mainClassName = "<module-name>/<mainclass-name>"
}
tasks {
compileJava {
doFirst {
options.compilerArgs = listOf(
"--module-path", classpath.asPath,
"--module-version", "${project.version}"
)
classpath = files()
}
}
named<JavaExec>("run") {
doFirst {
val main by sourceSets
jvmArgs = listOf(
"--module-path", classpath.asPath,
"--patch-module", "<module-name>=${main.output.resourcesDir}",
"--module", application.mainClassName
)
classpath = files()
}
}
}
上面使用了
--patch-module
(请参阅
java
tool documentation):
Overrides or augments a module with classes and resources in JAR files or directories.
compileTestJava
和test
的配置与compileJava
和run
的配置大致相同);但是,由于模块系统不允许拆分包,因此,这仅允许进行“黑箱测试”(即,您只能测试公共(public)API)。 requires
指令,因此必须添加适当的--add-modules
和--add-reads
参数。然后,您必须考虑到大多数测试框架都需要反射访问。由于您不太可能将主模块作为开放模块,因此还必须添加适当的--add-opens
参数。 --module <module-name>
而不是--module <module-name>/<mainclass-name>
即可。这是通过使用--main-class
工具指定jar
选项来完成的。不幸的是,据我所知,Gradle Jar
任务类没有指定此方法。一种选择是使用doLast
和exec
手动调用jar
工具,并使用--update
JAR文件。application
插件还添加了创建启动脚本的任务(例如批处理文件)。假设您需要这些脚本,则必须将其配置为使用模块路径而不是类路径。sourceSets {
main {
output.setResourcesDir(java.outputDir)
}
}
注意:在将资源输出设置为与Java输出相同时,可能需要使用
jar
配置
duplicatesStrategy = DuplicatesStrategy.EXCLUDE
任务。
opens
仅资源包,则可能需要这样做。即使使用
--patch-module
,由于
opens
指令,在运行时也会出现错误,因为模块系统似乎在应用
--patch-module
之前执行了一些完整性验证。换句话说,仅资源包不会很快“存在”。我不确定是否有任何插件可以处理此用例。
opens
包不存在是允许的,尽管
javac
将发出警告。话虽如此,通过在
--patch-module
任务中使用
compileJava
可以消除警告。
tasks.compileJava {
doFirst {
val main by sourceSets
options.compilerArgs = listOf(
"--module-path", classpath.asPath,
"--patch-module", "<module-name>=${main.resources.sourceDirectories.asPath}"
"--module-version", "${project.version}"
)
classpath = files()
}
}
将资源和类合并到同一位置的另一种方法是,将
run
任务配置为针对
jar
任务构建的JAR文件执行。
关于java - 资源文件在构建Java 9模块的Gradle项目中位于何处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51864473/
有人告诉我,如果我只有一个“东西”,比如家(不是多个家),我应该在 routes.rb 中使用资源 :home,而不是资源 :home。但是当我查看路由时,POST 函数似乎想要 home#creat
Activity 开始。这些代码框架顺利通过。 // Initialize array adapters. One for already paired devices and //
资源 search-hadoop.com search-hadoop.com索引所有邮件列表,非常适合历史搜索。当你遇到问题时首先在这里搜索,因为很可能有人已经遇到了你的问题。 邮件列表 在A
我是 WPF 的新手,正在努力使用位于单独程序集中的样式。这就是我正在做的:- 我有一个带有\Themes 文件夹的类库项目,其中包含一个“generic.xaml”,它合并了\Themes 内的子文
我正在编写一个使用虚拟树状文件结构的插件。基本上它就像一个包含文件的标准文件系统,区别在于这些文件实际上并不存在于文件系统中的特定位置,而只是 java 对象。 这些当前由使用 SettingProv
如果我在 XAML 中使用以下内容,我会收到错误消息: 错
我正在使用 laravel 资源来获取 api 的数据: return [ 'id' => $this->id, 'unread' =>
我有以下 pom.xml: 4.0.0 mycompany resource-fail 0.0.1-SNAPSHOT BazBat
许多GDI +类都实现IDisposable,但是我不确定何时应该调用Dispose。对于使用new或静态方法(例如Graphics.CreateGraphics)创建的实例来说,这很明显。但是,由属
我正在构建一组 RESTful 资源,其工作方式如下:(我将使用“people”作为示例): 获取/people/{key} - 返回一个人对象 (JSON) GET/people?first_nam
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一个使用 $resource 的简单 Controller : var Regions = $resource('mocks/regions.json'); $scope.regions =
在 Azure 门户中,如何查看不同资源之间的依赖关系。我特别想查看哪些资源正在使用我要删除的存储。 最佳答案 您可以使用应用程序洞察应用程序 map 来执行此操作: 您还可以打开存储帐户的日志记录:
我正在使用 ionic 生成资源(图标和启动画面)。我正在使用 ionic v2.1.0 和 cordova v6.4.0。 到目前为止我一直在使用(它在以前的版本中工作): cordova plat
是否可以使用 Assets 包含子文件夹中的文件? 示例:[base_url]/assets/css/pepper-grinder/jquery-ui-1.8.11.custom.min.css 最佳
我正在阅读一些尝试教授 Android 开发的书。在书中,作者概述了 res/下的一些目录。他提到 res/menu 包含基于 XML 的菜单规范。他还提到了保存“通用文件”的 res/raw。当我创
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
我在服务器上使用 express-resource。在我的 AngularJS Controller 中: var User = $resource('/services/users/:use
因此,每当我运行我的应用程序时,它都会立即崩溃并给出以下错误: No package identifier when getting value for resource number 0x00000
对于我正在创建的(网络)应用程序,我需要使用基本身份验证在我的 UIWebView 中加载页面。 现在设置我使用的授权 header : NSString *result = [NSString st
我是一名优秀的程序员,十分优秀!