public static JibContainerBuilder fromExplodedWar(
      JavaContainerBuilder javaContainerBuilder,
      Path explodedWar,
      Set<String> projectArtifactFilename)
      throws IOException {
    Path webInfLib = explodedWar.resolve("WEB-INF/lib");
    Path webInfClasses = explodedWar.resolve("WEB-INF/classes");
    Predicate<Path> isDependency = path -> path.startsWith(webInfLib);
    Predicate<Path> isClassFile =
        // Don't use Path.endsWith(), since Path works on path elements.
        path -> path.startsWith(webInfClasses) && path.getFileName().toString().endsWith(".class");
    Predicate<Path> isResource = isDependency.or(isClassFile).negate();
    Predicate<Path> isSnapshot = path -> path.getFileName().toString().contains("SNAPSHOT");
    Predicate<Path> isProjectDependency =
        path -> projectArtifactFilename.contains(path.getFileName().toString());

    javaContainerBuilder
        .setResourcesDestination(RelativeUnixPath.get(""))
        .setClassesDestination(RelativeUnixPath.get("WEB-INF/classes"))
        .setDependenciesDestination(RelativeUnixPath.get("WEB-INF/lib"));

    if (Files.exists(explodedWar)) {
      javaContainerBuilder.addResources(explodedWar, isResource);
    }
    if (Files.exists(webInfClasses)) {
      javaContainerBuilder.addClasses(webInfClasses, isClassFile);
    }
    if (Files.exists(webInfLib)) {
      javaContainerBuilder.addDependencies(
          new DirectoryWalker(webInfLib)
              .filterRoot()
              .filter(isSnapshot.negate())
              .filter(isProjectDependency.negate())
              .walk());
      javaContainerBuilder.addSnapshotDependencies(
          new DirectoryWalker(webInfLib).filterRoot().filter(isSnapshot).walk());
      javaContainerBuilder.addProjectDependencies(
          new DirectoryWalker(webInfLib).filterRoot().filter(isProjectDependency).walk());
    }
    return javaContainerBuilder.toContainerBuilder();
  }
Constructs a new {@link JibContainerBuilder} for a WAR project.

@param javaContainerBuilder Java container builder to start with
@param explodedWar the exploded WAR directory
@param projectArtifactFilename the file names of project artifacts for project dependencies
@return {@link JibContainerBuilder} containing the layers for the exploded WAR
@throws IOException if adding layer contents fails
jib-plugins-common/src/main/java/com/google/cloud/tools/jib/plugins/common/JavaContainerBuilderHelper.java