我最近被要求解决由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)
我想从这些罐中提取组,工件和版本,而不是文件名。那可能吗?或者是否有更好的策略来解决/解决此问题,因为输入有限(没有应用程序日志,代码等...)?
答案 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。