Я создал веб-приложение. Я использую Gradle. Я новичок в Gradle, и я пытаюсь перенести один из моих проектов в модульную систему Java 9. Я переместил все банки в путь модуля вместо пути к классам. Вот фрагмент моего build.gradle
plugins {
id 'java-library'
id 'eclipse-wtp'
id 'war'
}
ext {
//logging
log4jGroupId = "org.apache.logging.log4j"
log4jVersion = "2.11.0"
.....
moduleName = "pk.training.basit.kanban"
}
dependencies {
// Unit Testing
testImplementation group: 'junit', name: 'junit', version: junitVersion
testImplementation group: 'org.junit.jupiter', name: 'junit-jupiter-engine', version: junitJupiterEngineVersion
implementation group: log4jGroupId, name: 'log4j-api', version: log4jVersion
.....
['log4j-core', 'log4j-jcl', 'log4j-slf4j-impl', 'log4j-web'].each {
runtime "${log4jGroupId}:$it:${log4jVersion}"
}
implementation group: 'javax.transaction', name: 'javax.transaction-api', version: javaxTransactionApiVersion
implementation (group: 'org.glassfish.jaxb', name: 'jaxb-runtime', version: jaxbVersion) {
exclude group: 'org.jvnet.staxex', module: 'stax-ex'
}
...
}
eclipse.classpath.file {
whenMerged {
entries.findAll { isModule(it) }.each { it.entryAttributes['module'] = 'true' }
}
}
boolean isModule(entry) {
// filter java 9 modules
entry.kind == 'lib' // Only libraries can be modules
}
eclipse.wtp.facet.file.withXml { facetXml ->
def root = facetXml.asNode()
root.installed.find { it.@facet == 'jst.java' }.@version = '9'
root.installed.find { it.@facet == 'jst.web' }.@version = '3.1'
}
compileJava {
inputs.property("moduleName", moduleName)
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath,
]
classpath = files() // Clears the classpath property by creating an empty file collection
}
}
compileTestJava {
inputs.property("moduleName", moduleName)
doFirst {
options.compilerArgs = [
'--module-path', classpath.asPath, // This is the default value for the classpath property used as the --module-path.
'--add-modules', 'org.junit.jupiter.api', // junit5 automatic module specific
'--add-modules', 'java.xml.bind', // jaxb specific
'--add-reads', "$moduleName=org.junit.jupiter.api", // allow junit to read your module
'--patch-module', "$moduleName=" + files(sourceSets.test.java.srcDirs).asPath, // Adds the test source files to the org.gradle.actors module.
]
classpath = files()
}
}
test {
inputs.property("moduleName", moduleName)
doFirst {
jvmArgs = [
'--module-path', classpath.asPath,
'--add-modules', 'ALL-MODULE-PATH',
'--add-reads', "$moduleName=org.junit.jupiter.api",
'--patch-module', "$moduleName=" + files(sourceSets.test.java.outputDir).asPath,
]
classpath = files()
}
}
Теперь, если я выполню задачу gradle build
или buildDependents
или testClasses
, я получу следующие ошибки
module not found: junit --> requires junit;
module not found: log4j.api --> requires log4j.api;
module not found: org.apache.logging.log4j.web --> requires org.apache.logging.log4j.web;
error: the unnamed module reads package javax.transaction.xa from both java.sql and javax.transaction.api
error: the unnamed module reads package javax.activation from both java.activation and activation
error: the unnamed module reads package com.sun.xml.bind from both jaxb.runtime and jaxb.core
error: module spring.web reads package javax.transaction.xa from both javax.transaction.api and java.sql
error: module spring.security.core reads package javax.transaction.xa from both javax.transaction.api and java.sql
....
Так почему я получаю исключение модуля не найден для jUnit
, log4j.api
и org.apache.logging.log4j.web
. Я проверил путь к модулю и там есть банки.
Во-вторых, я читал о разделенных пакетах Мой вопрос, как я знаю из ошибки, состоит в том, что две банки java.sql and javax.transaction.api
и jaxb.runtime and jaxb.core
и аналогичны другим банкам.
Могу ли я создать задачу Gradle, которая объединит эти две банки в одну и включит эту одну банку в путь модуля, чтобы эти ошибки можно было удалить? Или есть другой способ устранения таких ошибок?
Можно ли переместить несколько jar-файлов в путь к модулю, а некоторые jar-файлы в путь к классам? И как вы можете найти, какие банки для перемещения пути модуля, а какие банки для перемещения classpath?
Спасибо