code: protected synchronized boolean needsCompile(List<File> sources, File outputDir) throws IOException {
          if (!outputDir.isDirectory())
              return true;
  
          newestClassFile = null;
          Files.walkFileTree(Paths.get(outputDir.getPath()),
              EnumSet.noneOf(FileVisitOption.class), Integer.MAX_VALUE, new SimpleFileVisitor<Path>() {
                  public FileVisitResult visitFile(Path path, BasicFileAttributes attrs) throws IOException {
                      if (path.toString().endsWith(".class")) {
                          File classFile = path.toFile();
                          if (newestClassFile == null || classFile.lastModified() > newestClassFile.lastModified())
                              newestClassFile = classFile;
                      }
                      return FileVisitResult.CONTINUE;
                  }
              }
          );
          if (newestClassFile == null)
              return true;  // nothing compiled
  
          File newestSourceFile = null;
          for (File source : sources) {
              if (newestSourceFile == null || source.lastModified() > newestSourceFile.lastModified())
                  newestSourceFile = source;
          }
          for (Asset jar : AssetCache.getJarAssets()) {
              if (newestSourceFile == null || jar.file().lastModified() > newestSourceFile.lastModified())
                  newestSourceFile = jar.file();
          }
  
          boolean needsCompile = newestSourceFile.lastModified() >= newestClassFile.lastModified();
          if (logger.isDebugEnabled()) {
              if (needsCompile)
                  logger.debug("Kt needs compile due to " + newestSourceFile + " >= " + newestClassFile);
              else
                  logger.debug("Kt no compile due to " + newestSourceFile + " < " + newestClassFile);
          }
          return needsCompile;
      }
docs: Currently does an unsophisticated brute check of last modified source and asset jars versus
  the last compiled class file.
  TODO: https://github.com/CenturyLinkCloud/mdw/issues/392