捕获Oozie Java操作的类路径中所有jar的组,工件和版本

时间:2017-01-20 18:49:48

标签: java spring-boot oozie

我最近被要求解决由Oozie执行的Spring Boot程序的问题。不幸的是,我无法访问Spring Boot应用程序或日志。 :)我mvn dependency:tree -Ddetail=true 的输出

我告诉我Spring Boot应用程序本身运行良好,但在作为Oozie Java动作执行时不会运行。我们怀疑Oozie添加到类路径中的一些依赖项与Spring Boot中的依赖项冲突。

这有些推测,但我想运行一个简单的Oozie Java操作,该操作捕获添加到类路径的所有依赖项的组,工件和版本,并将其与依赖树进行比较。 Spring Boot应用程序。我认为,如果存在版本冲突,可以在pom.xml中排除/解决它们。

我编写了一个类,它将类路径中jar的名称写入文本文件:

void captureClasspath(){

    PrintWriter out = null;
    try {
        ClassLoader cl = ClassLoader.getSystemClassLoader();
        URL[] urls = ((URLClassLoader)cl).getURLs();

        out = new PrintWriter(new OutputStreamWriter(
                new BufferedOutputStream(new FileOutputStream("/tmp/classpath_capture.txt")), "UTF-8"));

        for (URL url : urls){
            out.println(url.getFile());
        }

    } catch (UnsupportedEncodingException | FileNotFoundException e) {
        e.printStackTrace();
    } finally {
        if(out != null) {
            out.flush();
            out.close();
        }
    }

}

输出如下:

/hadoop/yarn/local/filecache/10/mapreduce.tar.gz/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.1.2.4.3.0-227-tests.jar
/hadoop/yarn/local/filecache/10/mapreduce.tar.gz/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-2.7.1.2.4.3.0-227.jar
/hadoop/yarn/local/filecache/10/mapreduce.tar.gz/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-core-2.7.1.2.4.3.0-227.jar
/hadoop/yarn/local/filecache/10/mapreduce.tar.gz/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-hs-2.7.1.2.4.3.0-227.jar
/hadoop/yarn/local/filecache/10/mapreduce.tar.gz/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.1.2.4.3.0-227.jar
... etc ... (more than 300 lines)

我想从这些罐中提取组,工件和版本,而不是文件名。那可能吗?或者是否有更好的策略来解决/解决此问题,因为输入有限(没有应用程序日志,代码等...)?

1 个答案:

答案 0 :(得分:2)

  

我想提取组,工件和文件,而不是文件名   来自这些罐子的版本。这可能吗?

这需要读取每个jar文件的内容,并从jar文件中的相关条目中提取组,工件和版本。实现此目的的一些相关方法是JarFile#entries()JarFile#getEntry(String)JarFile#getInputStream(ZipEntry)

Maven构建将在META-INF/maven/<group>/<artifact>/pom.properties的jar中存储一个条目。例如,运行jar xf hadoop-common.jar提取META-INF/maven/org.apache.hadoop/hadoop-common/pom.properties,其中包含以下数据:

#Generated by Maven
#Thu Aug 18 01:41:25 UTC 2016
version=2.7.3
groupId=org.apache.hadoop
artifactId=hadoop-common

Hadoop应用程序的类路径版本冲突的几个常见来源是Guava,Jackson和Protobuf。