Java 使用Gradle构建EAR文件:如果WebModule是快照依赖项,如何配置它们?

Java 使用Gradle构建EAR文件:如果WebModule是快照依赖项,如何配置它们?,java,gradle,build.gradle,wildfly,ear,Java,Gradle,Build.gradle,Wildfly,Ear,我使用Gradle从外部依赖项创建EAR文件,如下所示: ... dependencies { ... deploy group: 'xx.xxx.xxx.xxx', name: 'war-name', version: '0.3.0', ext: 'war' ... } ear { deploymentDescriptor { webModule("war-name-0.3.0.war", "/war-name")

我使用Gradle从外部依赖项创建EAR文件,如下所示:

...
dependencies {
...
    deploy group: 'xx.xxx.xxx.xxx', name: 'war-name', version: '0.3.0', ext: 'war'
...
}

ear {
    deploymentDescriptor {
        webModule("war-name-0.3.0.war", "/war-name")
    }
}
...

ear {
    deploymentDescriptor {
        webModule("war-name-" + TIMESTAMP_OF_SNAPSHOT + ".war", "/war-name")
    }
}
...
ear配置实现了在HTTP端点的路径中不包含版本号的目标。此解决方案在中提出

到目前为止,一切正常。但是,如果我对具有快照版本的WAR文件执行相同操作,则webModule的配置将不再有效,因为WAR文件的文件名包含快照的时间戳,而不是与版本完全相同的调用:

...
dependencies {
...
    deploy group: 'xx.xxx.xxx.xxx', name: 'war-name', version: '0.3.0-SNAPSHOT', ext: 'war'
...
}

ear {
    deploymentDescriptor {
        // This fails, because the war file does not have this exact name, but instead contains 
        // the timestamp of the SNAPSHOT's buildtime.
        webModule("war-name-0.3.0-SNAPSHOT.war", "/war-name")
    }
}
...
如果执行上述操作,则生成的
application.xml
包含以下条目:

  <module>
    <web>
      <web-uri>war-name-0.3.0-20200714.134805-4.war</web-uri>
      <context-root>war-name-0.3.0-20200714.134805-4</context-root>
    </web>
  </module>
  <module>
    <web>
      <web-uri>war-name-0.3.0-SNAPSHOT.war</web-uri>
      <context-root>/war-name</context-root>
    </web>
  </module>

然而,我有点不知道如何找到封装在EAR中的确切快照版本的时间戳。有什么想法吗?谢谢你的帮助

现在我自己已经找到了解决办法。 您可以通过搜索配置来查找已使用的War文件:

ear {
    // Since we use SNAPSHOT-Versions sometimes (e.g. for integration testing),
    // We cannot just use the version of the war files when specifying the webModules.
    // Instead, we have to find out the exact filename of the used war-file (which will have an
    // arbitrary timestamp in the case of SNAPSHOT Versions).
    final def actualWarFileUsed = configurations.getByName("deploy")
            .filter{ final dep -> dep.name.contains("war-name")}
            .getSingleFile()
            .name

    deploymentDescriptor {
        webModule(actualWarFileUsed, "/war-name")
    }
}

也许这对有同样问题的人有帮助

ear {
    // Since we use SNAPSHOT-Versions sometimes (e.g. for integration testing),
    // We cannot just use the version of the war files when specifying the webModules.
    // Instead, we have to find out the exact filename of the used war-file (which will have an
    // arbitrary timestamp in the case of SNAPSHOT Versions).
    final def actualWarFileUsed = configurations.getByName("deploy")
            .filter{ final dep -> dep.name.contains("war-name")}
            .getSingleFile()
            .name

    deploymentDescriptor {
        webModule(actualWarFileUsed, "/war-name")
    }
}