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();
  }
@Test
  public void testFromExplodedWar()
      throws URISyntaxException, IOException, InvalidImageReferenceException,
          CacheDirectoryCreationException {
    // Copy test files to a temporary directory that we can safely operate on
    Path resourceExplodedWar =
        Paths.get(Resources.getResource("plugins-common/exploded-war").toURI());
    FileOperations.copy(ImmutableList.of(resourceExplodedWar), temporaryFolder.getRoot().toPath());
    Path temporaryExplodedWar = temporaryFolder.getRoot().toPath().resolve("exploded-war");
    Files.createDirectories(temporaryExplodedWar.resolve("WEB-INF/classes/empty_dir"));
    Files.createFile(temporaryExplodedWar.resolve("WEB-INF/lib/project-dependency-1.0.0.jar"));
    Set<String> projectArtifacts = ImmutableSet.of("project-dependency-1.0.0.jar");

    JavaContainerBuilder javaContainerBuilder =
        JavaContainerBuilder.from(RegistryImage.named("base"))
            .setAppRoot(AbsoluteUnixPath.get("/my/app"));
    JibContainerBuilder jibContainerBuilder =
        JavaContainerBuilderHelper.fromExplodedWar(
            javaContainerBuilder, temporaryExplodedWar, projectArtifacts);
    BuildContext buildContext =
        JibContainerBuilderTestHelper.toBuildContext(
            jibContainerBuilder,
            Containerizer.to(RegistryImage.named("target"))
                .setExecutorService(MoreExecutors.newDirectExecutorService()));

    FileEntriesLayer resourcesLayerConfigurations =
        getLayerConfigurationByName(buildContext, LayerType.RESOURCES.getName());
    FileEntriesLayer classesLayerConfigurations =
        getLayerConfigurationByName(buildContext, LayerType.CLASSES.getName());
    FileEntriesLayer dependenciesLayerConfigurations =
        getLayerConfigurationByName(buildContext, LayerType.DEPENDENCIES.getName());
    FileEntriesLayer snapshotsLayerConfigurations =
        getLayerConfigurationByName(buildContext, LayerType.SNAPSHOT_DEPENDENCIES.getName());
    FileEntriesLayer projectDependenciesLayerConfigurations =
        getLayerConfigurationByName(buildContext, LayerType.PROJECT_DEPENDENCIES.getName());

    assertThat(projectDependenciesLayerConfigurations.getEntries())
        .comparingElementsUsing(SOURCE_FILE_OF)
        .containsExactly(temporaryExplodedWar.resolve("WEB-INF/lib/project-dependency-1.0.0.jar"));
    assertThat(dependenciesLayerConfigurations.getEntries())
        .comparingElementsUsing(SOURCE_FILE_OF)
        .containsExactly(temporaryExplodedWar.resolve("WEB-INF/lib/dependency-1.0.0.jar"));
    assertThat(snapshotsLayerConfigurations.getEntries())
        .comparingElementsUsing(SOURCE_FILE_OF)
        .containsExactly(
            temporaryExplodedWar.resolve("WEB-INF/lib/dependencyX-1.0.0-SNAPSHOT.jar"));
    assertThat(resourcesLayerConfigurations.getEntries())
        .comparingElementsUsing(SOURCE_FILE_OF)
        .containsExactly(
            temporaryExplodedWar.resolve("META-INF"),
            temporaryExplodedWar.resolve("META-INF/context.xml"),
            temporaryExplodedWar.resolve("Test.jsp"),
            temporaryExplodedWar.resolve("WEB-INF"),
            temporaryExplodedWar.resolve("WEB-INF/classes"),
            temporaryExplodedWar.resolve("WEB-INF/classes/empty_dir"),
            temporaryExplodedWar.resolve("WEB-INF/classes/package"),
            temporaryExplodedWar.resolve("WEB-INF/classes/package/test.properties"),
            temporaryExplodedWar.resolve("WEB-INF/lib"),
            temporaryExplodedWar.resolve("WEB-INF/web.xml"));
    assertThat(classesLayerConfigurations.getEntries())
        .comparingElementsUsing(SOURCE_FILE_OF)
        .containsExactly(
            temporaryExplodedWar.resolve("WEB-INF/classes/HelloWorld.class"),
            temporaryExplodedWar.resolve("WEB-INF/classes/empty_dir"),
            temporaryExplodedWar.resolve("WEB-INF/classes/package"),
            temporaryExplodedWar.resolve("WEB-INF/classes/package/Other.class"));

    assertThat(dependenciesLayerConfigurations.getEntries())
        .comparingElementsUsing(EXTRACTION_PATH_OF)
        .containsExactly("/my/app/WEB-INF/lib/dependency-1.0.0.jar");
    assertThat(snapshotsLayerConfigurations.getEntries())
        .comparingElementsUsing(EXTRACTION_PATH_OF)
        .containsExactly("/my/app/WEB-INF/lib/dependencyX-1.0.0-SNAPSHOT.jar");
    assertThat(resourcesLayerConfigurations.getEntries())
        .comparingElementsUsing(EXTRACTION_PATH_OF)
        .containsExactly(
            "/my/app/META-INF",
            "/my/app/META-INF/context.xml",
            "/my/app/Test.jsp",
            "/my/app/WEB-INF",
            "/my/app/WEB-INF/classes",
            "/my/app/WEB-INF/classes/empty_dir",
            "/my/app/WEB-INF/classes/package",
            "/my/app/WEB-INF/classes/package/test.properties",
            "/my/app/WEB-INF/lib",
            "/my/app/WEB-INF/web.xml");
    assertThat(classesLayerConfigurations.getEntries())
        .comparingElementsUsing(EXTRACTION_PATH_OF)
        .containsExactly(
            "/my/app/WEB-INF/classes/HelloWorld.class",
            "/my/app/WEB-INF/classes/empty_dir",
            "/my/app/WEB-INF/classes/package",
            "/my/app/WEB-INF/classes/package/Other.class");
  }