我一直在将 Maven 构建迁移到 Gradle,并且在 Windows 上遇到了一些奇怪的行为。我已经尝试弄清楚有一段时间了,但没有运气。
jar
捆绑在一起)JavaExec
的 Gradle startWebapp
任务,用于开发人员目的并运行 com.example.Application
(然后启动嵌入式 jetty 服务器)3.
执行相同的操作(但它只是通过 IntelliJ,然后委托给 Gradle 并动态生成相同的 JavaExec 任务)当您通过 IntelliJ (
4.
) 启动应用程序时,一切总是工作得很好,Jetty 能够在类路径上找到所有内容,并且应用程序工作得很好(包括 Vaadin v23):
Classpath: C:\Users\user\project\webapp\build\classes\java\main;C:\Users\user\Desktop\project\build\resources\main;C:\.g\caches\modules-2\files-2.1\org.vaadin.addons.mekaso\progress\1.1.0\80e3e1cd9d58b654a805b5bb3beeeb498eceaf1a\progress-1.1.0.jar;C:\Users\user\project\data\build\libs\data-1.0-SNAPSHOT.jar;C:\Users\user\project\data\build\libs\data-jooq.jar;C:\.g\caches\modules-2\files-2.1\org.slf4j\jcl-over-slf4j\1.7.32\32c060250bcc5282cdbc1fd7008c12eb4ebad00e\jcl-over-slf4j-1.7.32.jar;.....
...
...
22:19:03.285 [main] [1] INFO o.e.j.server.handler.ContextHandler - Started o.e.j.w.WebAppContext@3316aef6{PORTAL,/,[
file:///C:/Users/user/Desktop/project/webapp/build/resources/main/webapp/,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-time-picker-flow/23.3.18/a24ef5ffac099aae7dfe63cec074c018646cca40/vaadin-time-picker-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-iron-list-flow/23.3.18/d7d4585c24110ac1f9c7f933e8997fb6c3ef8a80/vaadin-iron-list-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-context-menu-flow/23.3.18/fec91948198bf2eb3ac1510641ca7a2d41018b42/vaadin-context-menu-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-date-picker-flow/23.3.18/36374182ba4d0ea0bb99e66d93e52ba6119eb37c/vaadin-date-picker-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-combo-box-flow/23.3.18/97ee34b921ebf7ff336eff57b29798baf7a35c5b/vaadin-combo-box-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/org.webjars.npm/mobile-drag-drop/2.3.0-rc.2/5a95a71ecc9e41b2253b80badc1ad0a9b8f3b7a4/mobile-drag-drop-2.3.0-rc.2.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/org.vaadin.artur/a-vaadin-helper/1.6.0/692ea343800b5ea51adb1651bcaf98e627aafaa/a-vaadin-helper-1.6.0.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/org.vaadin.tatu/twincolselect/2.5.2/4a59c13f997078a52768f7721fa492493dbc105/twincolselect-2.5.2.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-cookie-consent-flow/23.3.18/e99f90304a8c9b22dc6f12506d4850e2746ca18f/vaadin-cookie-consent-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-select-flow/23.3.18/813e308dd1a5b35547b2d338e1dcb7753d676722/vaadin-select-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-text-field-flow/23.3.18/e7ef3de85325333a88b6bd224a4144fea4898734/vaadin-text-field-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/flow-push/23.3.16/460e0a502c38511257436b71c334e98d90e7cb3c/flow-push-23.3.16.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-grid-flow/23.3.18/cf01e2c605443bddc83d0c759d4f76e663b3bde7/vaadin-grid-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-flow-components-base/23.3.18/662f5bc9b17fb5f48e83543c207454397d38c584/vaadin-flow-components-base-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/org.vaadin.addons.componentfactory/vcf-pdf-viewer/2.7.2/a69ba7388a84b033f110b31dd70eef67cec74c4d/vcf-pdf-viewer-2.7.2.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-lumo-theme/23.3.18/aab7be1217208672705d42cec3a63b809fdee694/vaadin-lumo-theme-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-login-flow/23.3.18/ac9ae3ac844c2e68db1b67e8665a5739d5b61490/vaadin-login-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/flow-client/23.3.16/49ee696e8d9c0089e6e3c3a66730c16cd0db36f/flow-client-23.3.16.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.github.appreciated/vaadin-css-grid/2.0.0/c18252cef8e53dd0e35102a658f97d6683b0cf2c/vaadin-css-grid-2.0.0.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin.componentfactory/togglebutton/3.0.0/3bddbf166f35f4d825494b2a167dd03e007c8ded/togglebutton-3.0.0.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/org.vaadin.olli/file-download-wrapper/6.0.0/fffa0c0d5fac979c69f494526626bab154e4919f/file-download-wrapper-6.0.0.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/flow-dnd/23.3.16/860aa3d49c2c4199761df3bc996d9aecfb3d17a8/flow-dnd-23.3.16.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-confirm-dialog-flow/23.3.18/9745a1d982e73f4075f4c5f0a5e878c99e607e17/vaadin-confirm-dialog-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/org.webjars.npm/vaadin__vaadin-mobile-drag-drop/1.0.1/57cea9e7d3c1f5cebaa8c2e99b07c9bdc734878e/vaadin__vaadin-mobile-drag-drop-1.0.1.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-notification-flow/23.3.18/de2be63f0d7358f2b909bf2c6bc6c00512cd4efa/vaadin-notification-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-renderer-flow/23.3.18/316bdaa15e5e2f884fc000f8d2440e8af6c646b8/vaadin-renderer-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-grid-pro-flow/23.3.18/dc2133f6795e76ed256b6dc30b6c0f5f6905d6e0/vaadin-grid-pro-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-material-theme/23.3.18/621aa9d5dadc14e0ecfe61fdb907144f54bb553b/vaadin-material-theme-23.3.18.jar!/META-INF/resources,
file:///C:/Users/user/Desktop/project/webapp/build/resources/main/META-INF/resources/,
jar:file:///C:/.g/caches/modules-2/files-2.1/in.virit/viritin/1.7.4/956eb20f7d9e55bf170d793ad138fce19d4e604b/viritin-1.7.4.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/org.vaadin.tarek/collapsible-splitlayout/2.0.0/4ca3511471467448c5d02fd9e2c59db8575e7421/collapsible-splitlayout-2.0.0.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-virtual-list-flow/23.3.18/c9c59b1af59ea56dc2487f1badaca4215caa4e29/vaadin-virtual-list-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-messages-flow/23.3.18/292e3f13db5723d98e06d07cd38585ba6f0ed619/vaadin-messages-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/org.vaddon/mediaquery/4.0.1/74d28205eb548468a02c2fc22645f1f08559e3ac/mediaquery-4.0.1.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-menu-bar-flow/23.3.18/8b1fc8b01569604dcbb81c0b9fdd9d3412ea5124/vaadin-menu-bar-flow-23.3.18.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/de.jfancy/star-rating/1.0.3/9ae9580fa72c2a736279d81a89186fe9e2a86ccf/star-rating-1.0.3.jar!/META-INF/resources,
jar:file:///C:/.g/caches/modules-2/files-2.1/com.vaadin/vaadin-dialog-flow/23.3.18/c1f001d5f346db87c70968d0e5402b1249be7bba/vaadin-dialog-flow-23.3.18.jar!/META-INF/resources
],AVAILABLE}
但是,一旦您从 Windows 上名为
JavaExec
的 startWebapp
任务启动应用程序,该应用程序就根本无法运行。它可以在 Linux/OSx 上运行,但不能在 Windows 上运行,即使使用 Gradle 的自动 jar 路径:
Classpath: C:\.g\.tmp\gradle-javaexec-classpath14042817672156947631.jar
...
...
22:17:37.212 [main] [1] INFO o.e.j.server.handler.ContextHandler - Started o.e.j.w.WebAppContext@57fd93f9{PORTAL,/,[
file:///C:/Users/user/Desktop/project/webapp/build/resources/main/webapp/,
],AVAILABLE}
而且您偶尔会在日志中看到此异常
com.vaadin.flow.server.StaticFileHandler.serveStaticResource(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)" because "this.staticFileHandler" is null
或者这个(Vaadin 构建某种失败)
------------------ Starting Frontend compilation. ------------------
22:17:51.584 [ForkJoinPool.commonPool-worker-1] [48] INFO c.v.b.d.AbstractDevServerRunner - Running Vite to compile frontend resources. This may take a moment, please stand by...
22:17:52.018 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - node:events:492
22:17:52.018 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - throw er; // Unhandled 'error' event
22:17:52.018 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - ^
22:17:52.018 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker -
22:17:52.018 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - Error: read ENOTCONN
22:17:52.019 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at tryReadStart (node:net:683:20)
22:17:52.019 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at Socket._read (node:net:694:5)
22:17:52.019 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at Readable.read (node:internal/streams/readable:496:12)
22:17:52.019 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at Socket.read (node:net:750:39)
22:17:52.019 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at new Socket (node:net:471:12)
22:17:52.019 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at Object.Socket (node:net:340:41)
22:17:52.019 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at createSocket (node:internal/child_process:328:14)
22:17:52.020 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at ChildProcess.spawn (node:internal/child_process:443:23)
22:17:52.020 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at Object.spawn (node:child_process:757:9)
22:17:52.020 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at ensureServiceIsRunning (C:\Users\user\Desktop\project\webapp\node_modules\esbuild\lib\main.js:2052:29)
22:17:52.020 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - Emitted 'error' event on Socket instance at:
22:17:52.020 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at emitErrorNT (node:internal/streams/destroy:151:8)
22:17:52.021 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at emitErrorCloseNT (node:internal/streams/destroy:116:3)
22:17:52.021 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - at process.processTicksAndRejections (node:internal/process/task_queues:82:21) {
22:17:52.021 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - errno: -4053,
22:17:52.021 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - code: 'ENOTCONN',
22:17:52.021 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - syscall: 'read'
22:17:52.021 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - }
22:17:52.021 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker -
22:17:52.021 [dev-server-output] [71] INFO c.v.b.d.DevServerOutputTracker - Node.js v18.17.1
------------------ Frontend compilation failed. ------------------
startWebapp
gradle 任务是:
create<JavaExec>("startWebapp") {
val workingDirPath = projectDir
val javaTmp = buildDir.resolve("tmp/startWebapp").resolve(System.currentTimeMillis().toString())
systemProperties = mapOf(
// This is specifically necessary for Windows to avoid "Access Denied" exceptions because
// for some reason it tries to write to `C:\Windows\jetty-0_0_0_0-8080-webapp-_-any-12211458786276099803`
"java.io.tmpdir" to javaTmp
)
classpath = mainSourceSet.runtimeClasspath
mainClass.set(mainClassString)
args = listOf("--profile=local-defaults", "-ea")
workingDir = workingDirPath
doFirst {
println("Set -Djava.io.tmpdir=$javaTmp and create directory.")
javaTmp.mkdirs()
}
dependsOn("processResources") // make sure git.properties is generated.
dependsOn("vaadinPrepareFrontend")
}
pathing.jar
路径)这两次尝试都失败了,无论我做什么,Jetty 似乎都没有检测到资源(再次..特别是在 WINDOWS 上)。
我怀疑 IntellIJ 正在幕后施展一些我所忽略的魔法。或者也许有一个配置标志需要在 Jetty 中翻转,使其也可以与“pathing jars”一起使用?
C:\.g\.tmp\gradle-javaexec-classpath14042817672156947631.jar!META-INF/MANIFEST.MF
Manifest-Version: 1.0
Class-Path: file:/C:/Users/user/--------------project----------------/we
bapp/build/classes/java/main/ file:/C:/Users/user/---------p---------/-
---project------/webapp/build/resources/main/ file:/C:/.g/caches/module
s-2/files-2.1/org.vaadin.addons.mekaso/progress/1.1.0/80e3e1cd9d58b654a
805b5bb3beeeb498eceaf1a/progress-1.1.0.jar file:/C:/Users/user/-------/
--------------project--------/data/build/libs/data-1.0-SNAPSHOT.jar fil
e:/C:/Users/user/--------------project----------------/data/build/libs/
data-jooq.jar file:/C:/.g/caches/modules-2/files-2.1/org.slf4j/jcl-over
-slf4j/1.7.32/32c060250bcc5282cdbc1fd7008c12eb4ebad00e/jcl-over-slf4j-1
.7.32.jar file:/C:/.g/caches/modules-2/files-2.1/org.slf4j/jul-to-slf4j
/1.7.32/8a055c04ab44e8e8326901cadf89080721348bdb/jul-to-slf4j-1.7.32.ja
r file:/C:/.g/caches/modules-2/files-2.1/ch.qos.logback/logback-classic
/1.2.9/7d495522b08a9a66084bf417e70eedf95ef706bc/logback-classic-1.2.9.j
ar file:/C:/.g/caches/modules-2/files-2.1/com.twilio.sdk/twilio/9.9.0/e
8efda227f790e472d9d9253944416a84fd66907/twilio-9.9.0.jar
... Trimmed, but contains all classpath artifacts ...
您的
Class-Path
清单条目显示绝对 URL。
这不是 JAR 规范和
Class-Path
属性所说的内容。
参见:https://docs.oracle.com/en/java/javase/17/docs/specs/jar/jar.html#class-path-attribute
那些应该是相对 URL 引用。
绝对条目违反了上面链接中的第 2 点。 (复制/粘贴到此处)
提交了一个问题如果满足以下条件,则类路径条目有效:
- 它可用于通过根据上下文 JAR 的 URL 解析 URL 来创建 URL。
- 它是相对的,而不是绝对的,即它不包含方案组件,除了从文件系统加载上下文 JAR 的情况,在这种情况下,出于兼容性原因允许使用文件方案。
- 此条目表示的 JAR 文件或目录的位置包含在上下文 JAR 的包含目录中。不允许使用“../”导航到父目录,从文件系统加载上下文 JAR 的情况除外。