apachespark项目,带有datanucleus的单个可执行jar

l5tcr1uw  于 2021-05-29  发布在  Spark
关注(0)|答案(1)|浏览(590)

我正在尝试运行一个使用apachespark和java的java项目。该项目是从git克隆的:https://github.com/onsdigital/address-index-data. 我对spark和java都是新手,这对我没有帮助。我不能用类似问题的答案来解决问题,例如这里
如果我按原样从intellij运行代码(在application.conf中使用正确的本地elasticsearch设置),那么一切都很正常-intellij似乎可以下载所需的jar文件并在运行时链接它们。但是,我需要配置项目,以便可以从命令行运行它。这似乎是github项目中列出的一个已知问题,没有提供解决方案。
如果我跑了 sbt clean assembly 如说明书所示,它成功地生成了一个完整的jar文件。但是,使用 java -Dconfig.file=application.conf -jar batch/target/scala-2.11/ons-ai-batch-assembly-version.jar 发生这种情况:

20/06/16 17:06:41 WARN Utils: Your hostname, MacBook-Pro.local resolves to a loopback address: 127.0.0.1; using 192.168.1.163 instead (on interface en0)
20/06/16 17:06:41 WARN Utils: Set SPARK_LOCAL_IP if you need to bind to another address
20/06/16 17:06:43 WARN NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
20/06/16 17:06:44 WARN Persistence: Error creating validator of type org.datanucleus.properties.CorePropertyValidator
ClassLoaderResolver for class "" gave error on creation : {1}
org.datanucleus.exceptions.NucleusUserException: ClassLoaderResolver for class "" gave error on creation : {1}
        at org.datanucleus.NucleusContext.getClassLoaderResolver(NucleusContext.java:1087)
        at org.datanucleus.PersistenceConfiguration.validatePropertyValue(PersistenceConfiguration.java:797)
        at org.datanucleus.PersistenceConfiguration.setProperty(PersistenceConfiguration.java:714)

例如,从前面的文章来看,我认为这是因为sbt正在合并jar文件,信息丢失了。然而,我也不知道该怎么做
正确合并,或
用构建类路径的构建脚本整理所有必要的jar文件(包括scala库),并用java命令执行jar文件。
我怎么继续?请保持指示明确,因为我真的不确定的xml配置等,谢谢!

mw3dktmi

mw3dktmi1#

所以在我的头撞到墙上很久之后,我终于解决了这个问题。答案主要来自另外两个stackoverflow解决方案(这里和这里)(非常感谢这些作者!)但我会添加更多的细节,因为我仍然需要更多的指针。
正如oscarkorz所说,问题在于“datanucleus核心试图将模块作为osgi包加载,即使它没有在osgi容器中运行。只要jar没有合并,这个就可以了”,我需要这样做。因此,在运行“sbt clean assembly”时,合并的jar错误地合并了datanucleus插件文件,并且没有在manifest.mf中添加额外的osgi部分。
关于如何修复“胖jar”,我将给出明确的细节(和一些提示)。
为了得到“肥jar”的大部分,我跑了 sbt clean assembly 但是我确保在build.sbt中的assemblymergestategy中添加了plugin.xml(使用first或last,所以我们保留plugin.xml):

assemblyMergeStrategy in assembly := {
    ...
    case "plugin.xml" => MergeStrategy.first
    ...
  }

这在batch/target/scala文件夹中给出了一个“fat jar”(仍然不起作用),其中是使用的scala版本。
将生成的jar tar文件复制到单独的目录中,然后使用以下方法将其解包: jar xvf your-jar-assembly-0.1.jar 在解包文件夹中,通过在末尾添加以下内容来编辑meta inf/manifest.mf文件:
Bundle-SymbolicName: org.datanucleus;singleton:=true Premain-Class: org.datanucleus.enhancer.DataNucleusClassFileTransformer 现在我们需要通过合并3个datanucleus文件来修复plugin.xml。找到并解压原始的datanucleusjar文件(如上所述),并分离出每个plugin.xml(它们是不同的)。stackoverflow解决方案中的anebril解决方案为合并这三个文件提供了一个良好的开端。但我要补充一个提示:
使用此命令对3个datanucleus文件中的内容进行管道传输,这将告诉您哪里有需要合并的扩展名: cat plugin_core.xml plugin_rdbms.xml plugin_api.xml | grep -h "extension point" | tr -d "[:blank:]"| sort | uniq -d 您仍然需要手动管理高亮显示为重复的元素的合并。
在解压缩的your-jar-assembly-0.1.jar文件夹中,用新合并的plugin.xml替换原来的plugin.xml。
再次对jar文件加焦油(但要包括清单!) jar cmvf META-INF/MANIFEST.MF your-jar-assembly-0.1.jar * 将这个jar文件复制回batch/target/scala-文件夹(替换原来的)。
然后你可以使用 java -Dconfig.file=application.conf -jar batch/target/scala-2.XXX/your-jar-assembly-0.1.jar 去跑肥jar。瞧!

相关问题