Gradle JavaExec 任务无法在 Windows 上启动嵌入式 Jetty 服务器

问题描述 投票:0回答:1

我一直在将 Maven 构建迁移到 Gradle,并且在 Windows 上遇到了一些奇怪的行为。我已经尝试弄清楚有一段时间了,但没有运气。

考虑以下细节:

  1. 正在使用Gradle 8.3
  2. 已经编写了一个使用嵌入式jetty服务器的java Web应用程序(并将其与生成的
    jar
    捆绑在一起)
  3. 一个名为
    JavaExec
    的 Gradle
    startWebapp
    任务,用于开发人员目的并运行
    com.example.Application
    (然后启动嵌入式 jetty 服务器)
  4. 一个 IntelliJ 运行配置,与
    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. ------------------

设置

  1. IntelliJ Run 配置

  1. 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")
     }
    

我尝试过的事情

  1. 手动路径(与 Gradle 类似,但相对于
    pathing.jar
    路径)
  2. 创建一个使用 argFile 的类路径,该类路径与 IntelliJ 运行配置中的类路径完全相同。

这两次尝试都失败了,无论我做什么,Jetty 似乎都没有检测到资源(再次..特别是在 WINDOWS 上)。

想法?

我怀疑 IntellIJ 正在幕后施展一些我所忽略的魔法。或者也许有一个配置标志需要在 Jetty 中翻转,使其也可以与“pathing jars”一起使用?

评论回复:

  1. 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 ...
    
gradle vaadin embedded-jetty java-17 jetty-10
1个回答
0
投票

您的

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 的情况除外。

我继续在 https://github.com/gradle/gradle/issues/26313

提交了一个问题
© www.soinside.com 2019 - 2024. All rights reserved.