【问题标题】:Bazel war file has invalid './' directoryBazel 战争文件具有无效的“./”目录
【发布时间】:2017-09-01 14:34:02
【问题描述】:

我能够从 Eclipse 导出到 .war 文件并在 Tomcat 上运行它。但是,当我使用 Bazel 构建它时,生成的 .war 文件无法在 Tomcat 上运行。

项目结构

project
|_src
|   |_main/java/*.java
|
|_WebContent
       |_META-INF
            |_Manifest.mf
       |_WEB-INF
            |_lib/*.jar
            |_web.xml

从 Eclipse 导出的 War 文件(并且正在运行)如下所示:

 inflated: META-INF/MANIFEST.MF
 inflated: .DS_Store
  created: META-INF/
  created: WEB-INF/
  created: WEB-INF/classes/
  created: WEB-INF/classes/main/
  created: WEB-INF/classes/main/java/
 inflated: WEB-INF/classes/main/java/.DS_Store
 inflated: WEB-INF/classes/main/java/foo.class
 inflated: WEB-INF/classes/main/.DS_Store
 inflated: WEB-INF/classes/.DS_Store
 inflated: WEB-INF/.DS_Store
  created: WEB-INF/lib/
 inflated: WEB-INF/lib/.DS_Store
 inflated: WEB-INF/lib/jersey-bundle-1.19.jar
 inflated: WEB-INF/web.xml

当我用 Bazel 创建一个 .war 时,我得到了这个:

 created: ./
  created: ./WEB-INF/
  created: ./WEB-INF/classes/
  created: ./WEB-INF/classes/main/
  created: ./WEB-INF/classes/main/java/
 inflated: ./WEB-INF/classes/main/java/.DS_Store
 inflated: ./WEB-INF/classes/main/java/foo.class
  created: ./WEB-INF/lib/
 inflated: ./WEB-INF/lib/jersey-bundle-1.19.jar
 inflated: ./WEB-INF/web.xml

我正在自定义 .bzl 文件以使用以下代码获取 war 文件:

def _war_impl(ctxt):
  zipper = ctxt.file._zipper 
  data_path = ctxt.attr.data_path

  war = ctxt.outputs.war
  build_output = war.path + ".WEB-INF"
  print("build_output = %s" % (build_output))
  cmd = [
      "set -e;rm -rf " + build_output,
      "mkdir -p %s" % build_output
      ]

  inputs = ctxt.files.jars + [zipper]
  cmd += ["mkdir -p %s/WEB-INF/lib" % build_output]
  cmd += ["mkdir -p %s/WEB-INF/classes/main/java" % build_output]

谁能指出如何使用 'mkdir' 进行构建,这样它就不会在 war 文件中创建 './' 目录?

【问题讨论】:

  • 这条规则你开源了吗?我有兴趣使用它。
  • @BenjaminMuschko 不幸的是我没有。
  • 您是否打算将其作为开源规则发布?
  • @BenjaminMuschko 我已经从项目中移除了将近 2 年,所以目前还没有这样的计划......

标签: war bazel


【解决方案1】:

原来问题出在 Bazel 文件(我创建了一个类似于 appengine bazel 规则的自定义 .bzl 规则)用于压缩文件的命令中:

def _make_war(zipper, input_dir, output):
  return [
      "(root=$(pwd);" +
      ("cd %s &&" % input_dir) +
      ("${root}/%s Cc ${root}/%s $(find .))" % (zipper.path, output.path))
      ]

$(find .) 正在返回 ./WEB-INF,所以当我将其更改为 $(find WEB-INF) 时,它返回了一个没有 './' 目录的 .war 文件,然后在 Tomcat 上运行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-03
    • 2018-11-03
    • 2015-02-16
    • 2017-09-18
    • 1970-01-01
    • 2018-01-03
    • 1970-01-01
    • 2023-03-14
    相关资源
    最近更新 更多