我试图在一台Linux机器上用sbt1.7.2编译spark,该机器的系统是CentOs6。
当我尝试执行清除指令时:./build/sbt clean
我得到以下输出:
java.lang.NullPointerException
at sun.net.util.URLUtil.urlNoFragString(URLUtil.java:50)
at sun.misc.URLClassPath.getLoader(URLClassPath.java:526)
at sun.misc.URLClassPath.getNextLoader(URLClassPath.java:498)
at sun.misc.URLClassPath.getResource(URLClassPath.java:252)
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:363)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:362)
at java.lang.ClassLoader.loadClass(ClassLoader.java:419)
at java.lang.ClassLoader.loadClass(ClassLoader.java:406)
at java.lang.ClassLoader.loadClass(ClassLoader.java:406)
at java.lang.ClassLoader.loadClass(ClassLoader.java:406)
at java.lang.ClassLoader.loadClass(ClassLoader.java:406)
at java.lang.ClassLoader.loadClass(ClassLoader.java:352)
at sbt.internal.XMainConfiguration.run(XMainConfiguration.java:51)
at sbt.xMain.run(Main.scala:46)
at xsbt.boot.Launch$.$anonfun$run$1(Launch.scala:149)
at xsbt.boot.Launch$.withContextLoader(Launch.scala:176)
at xsbt.boot.Launch$.run(Launch.scala:149)
at xsbt.boot.Launch$.$anonfun$apply$1(Launch.scala:44)
at xsbt.boot.Launch$.launch(Launch.scala:159)
at xsbt.boot.Launch$.apply(Launch.scala:44)
at xsbt.boot.Launch$.apply(Launch.scala:21)
at xsbt.boot.Boot$.runImpl(Boot.scala:78)
at xsbt.boot.Boot$.run(Boot.scala:73)
at xsbt.boot.Boot$.main(Boot.scala:21)
at xsbt.boot.Boot.main(Boot.scala)
[error] [launcher] error during sbt launcher: java.lang.NullPointerException
当我使用sbt1.7.3时也发生了这种情况,但当我使用sbt1.6.2时,它可以成功地清理和编译spark。
我应该先检查什么?我真的很感激任何人可以提供任何建议。
1条答案
按热度按时间hmae6n7t1#
Spark和sbt调试的几点建议。
如何在IntelliJ中构建Spark。
克隆https://github.com/apache/spark,在IntelliJ中将其作为sbt项目打开。
我必须执行
sbt compile
并重新打开项目,然后才能在IntelliJ中运行我的代码(在此之前我有一个错误object SqlBaseParser is not a member of package org.apache.spark.sql.catalyst.parser
)。当这些弹出窗口出现时,我也按了
Run npm install
、Load Maven project
,但我没有注意到区别。还有一次,我不得不在
sql/catalyst/target/scala-2.12/src_managed
中的Project Structure
中只保留一个源根sql/catalyst/target/scala-2.12/src_managed/main
(而不是sql/catalyst/target/scala-2.12/src_managed/main/antlr4
)。使用IntelliJ IDEA构建Apache Spark源代码:https://yujheli-wordpress-com.translate.goog/2020/03/26/build-apache-spark-source-code-with-intellij-idea/?_x_tr_sl=auto&_x_tr_tl=en&_x_tr_hl=uk&_x_tr_pto=wapp(中文原文:https://yujheli.wordpress.com/2020/03/26/build-apache-spark-source-code-with-intellij-idea/)的数据
Why does building Spark sources give "object sbt is not a member of package com.typesafe"?
如何在IntelliJ中构建sbt。
sbt本身是棘手的https://www.lihaoyi.com/post/SowhatswrongwithSBT.html和建设它也有点棘手。
克隆https://github.com/sbt/sbt,在IntelliJ中打开它。让我们尝试使用这个克隆的sbt运行前面的Spark代码。
sbt似乎不打算在指定的目录中运行。
(通常,不建议变更系统属性
user.dir
:(How to use "cd" command using Java runtime?)我必须首先执行
sbt compile
(这包括命令sbt generateContrabands
--- sbt使用sbt插件sbt-contraband
(ContrabandPlugin
,JsonCodecPlugin
),以前是sbt-datatype
,用于代码生成:https://github.com/sbt/contrabandhttps://www.scala-sbt.org/contraband/https://www.scala-sbt.org/1.x/docs/Datatype.htmlhttps://github.com/eed3si9n/gigahorse/tree/develop/core/src/main/contraband)。在此之前,我遇到了错误not found: value ScalaKeywords
。下一个错误是
type ExcludeItem is not a member of package sbt.internal.bsp
。您可以删除protocol/src/main/contraband-scala/sbt/internal/bsp/codec
中的文件ExcludeItemFormats.scala
、ExcludesItemFormats.scala
、ExcludesParamsFormats.scala
ExcludesResultFormats.scala
。它们是过期的自动生成的文件。如果删除目录protocol/src/main/contraband-scala
的内容,您可以检查(这是自动生成源代码的根目录)并执行sbt generateContrabands
,除这四个文件外的所有文件都将恢复。由于某些原因,这些文件不会混淆sbt,但会混淆IntelliJ。现在,在运行时,
MyClient
会产生sbt.client.Client
称为瘦客户端。sbt publishLocal
新建项目:
但是瘦客户机并不是sbt正常运行的方式。堆栈跟踪中的
sbt.xMain
来自https://github.com/sbt/sbt。它位于:https://github.com/sbt/sbt/blob/1.8.x/main/src/main/scala/sbt/Main.scala#L44但是来自堆栈跟踪的xsbt.boot.Boot
不是来自这个存储库,它来自https://github.com/sbt/launcher,即https://github.com/sbt/launcher/blob/1.x/launcher-implementation/src/main/scala/xsbt/boot/Boot.scalasbt的运行分为两步,sbt的可执行文件(通常从https://www.scala-sbt.org/download.html#universal-packages下载)是一个shell脚本,它首先运行
sbt-launch.jar
(对象xsbt.boot.Boot
)https://github.com/sbt/sbt/blob/v1.8.0/sbt#L507-L512
其次后者反射地调用SBT(类X1 M34 N1 X)
https://github.com/sbt/launcher/blob/v1.4.1/launcher-implementation/src/main/scala/xsbt/boot/Launch.scala#L147-L149
https://github.com/sbt/launcher/blob/v1.4.1/launcher-implementation/src/main/scala/xsbt/boot/Launch.scala#L496
https://github.com/sbt/launcher/blob/v1.4.1/launcher-implementation/src/main/scala/xsbt/boot/PlainApplication.scala#L13
然后
xMain#run
通过XMainConfiguration#run
反射调用xMain.run
https://github.com/sbt/sbt/blob/v1.8.0/main/src/main/scala/sbt/Main.scala#L44-L47
https://github.com/sbt/sbt/blob/v1.8.0/main/src/main/java/sbt/internal/XMainConfiguration.java#L51-L57
然后,它下载并运行Scala的必要版本(在
build.sbt
中指定)和sbt其余部分的必要版本(在project/build.properties
中指定)。什么是启动程序。
让我们考虑一个helloworld的发射器。
启动程序由一个库(接口)组成
https://mvnrepository.com/artifact/org.scala-sbt/launcher-interface
https://github.com/sbt/launcher/tree/1.x/launcher-interface
和发射器可运行的震击器
https://mvnrepository.com/artifact/org.scala-sbt/launcher
https://github.com/sbt/launcher/tree/1.x/launcher-implementation/src显示器
创建一个项目(取决于编译托姆的启动器接口)
执行
sbt publishLocal
。项目jar将发布在~/.ivy2/local/com.example/scalademo_2.13/0.1.0-SNAPSHOT/jars/scalademo_2.13.jar
下载启动程序可运行jar https://repo1.maven.org/maven2/org/scala-sbt/launcher/1.4.1/launcher-1.4.1.jar
创建启动程序配置
然后,命令
java -jar launcher-1.4.1.jar @my.app.configuration a b c
会产生出现文件
因此,Launcher有助于在只安装了Java的环境中运行应用程序(Scala不是必需的),将使用Ivy依赖关系解析。有一些特性可以处理返回代码,用不同的Scala版本重新启动应用程序,启动服务器等。
或者,可以使用以下任何命令
型
https://www.scala-sbt.org/1.x/docs/Launcher-Getting-Started.html显示器
如何使用启动程序运行sbt。
Sbt https://github.com/sbt/sbt使用sbt插件
SbtLauncherPlugin
https://github.com/sbt/sbt/blob/v1.8.0/project/SbtLauncherPlugin.scala以便从原始启动器launcher
https://github.com/sbt/launcher/tree/1.x/launcher-implementation/src显示器
https://mvnrepository.com/artifact/org.scala-sbt/launcher
它构建了
sbt-launch
https://github.com/sbt/sbt/tree/v1.8.0/launch
https://mvnrepository.com/artifact/org.scala-sbt/sbt-launch
基本上,
sbt-launch
与launcher
的不同之处在于注入了默认配置sbt.boot.properties
。如果我们想用启动器运行sbt,那么我们应该找到一种方法来为sbt指定一个工作目录(类似于我们在使用瘦客户机时所做的)。
工作目录可设置为1)在
sbt.xMain
(sbt
)中或2)在xsbt.boot.Boot
(sbt-launcher
)中。1)
将sbt.xMain
设为非final,以便可以扩充https://github.com/sbt/sbt/blob/v1.8.0/main/src/main/scala/sbt/Main.scala#L44
将新类放入
main/src/main/scala
(启动器样式的入口点)sbt publishLocal
个存储器
一道命令:
java -jar launcher-1.4.1.jar @my.sbt.configuration dir=/path_to_spark/spark "sql/runMain MyMain"
个或
x1米58英寸
(
sbt-launch.jar
取自~/.ivy2/local/org.scala-sbt/sbt-launch/1.8.1-SNAPSHOT/jars
,或者只是https://mvnrepository.com/artifact/org.scala-sbt/sbt-launch,因为我们还没有修改启动器)我必须从
spark
复制scalastyle-config.xml
,否则找不到它。我仍然有警告
fatal: Not a git repository (or any parent up to mount parent ...) Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set).
2)
个项目/依赖关系。scala*(https://github.com/sbt/sbt/blob/v1.8.0/project/依赖关系。
克隆https://github.com/sbt/launcher并进行以下更改
(请参阅://github.com/sbt/launcher/blob/v1.4.1/启动器-实现/源代码/主/scala/xsbt/ Boot /启动器-实现/源代码/主/scala/xsbt/启动器/启动器. scala)
启动程序实现/脚本语言/脚本语言/脚本语言/脚本语言/脚本语言/脚本语言/脚本语言/脚本语言/脚本语言
SBT发射器:x1米65英寸
第一次会议
一道命令:
java -jar launcher-1.4.2-SNAPSHOT.jar @my.sbt.configuration --mydir /path_to_spark/spark "sql/runMain MyMain"
或
x1米68英寸
(we正在使用修改的
launcher
或使用此修改的launcher
的新sbt-launch
)或者,我们可以在IntelliJ中为
xsbt.boot.Boot
指定“运行配置”中的“程序参数”@/path_to_sbt_config/my.sbt.configuration --mydir /path_to_spark/spark "sql/runMain MyMain"
个也可以在IntelliJ的“运行配置”中指定工作目录
/path_to_spark/spark
。x1米75英寸
我尝试使用
"org.scala-sbt" % "launcher" % "1.4.2-SNAPSHOT"
或"org.scala-sbt" % "sbt-launch" % "1.8.1-SNAPSHOT"
作为依赖项,但得到了No RuntimeVisibleAnnotations in classfile with ScalaSignature attribute: class Boot
。您的设置。
因此,我们可以在IntelliJ和/或
println
s中运行/调试sbt-launcher代码,并使用println
s运行/调试sbt代码(因为没有可运行的对象)。根据堆栈跟踪,我怀疑类加载器
urls
中的一个为空https://github.com/openjdk/jdk/blob/jdk8-b120/jdk/src/share/classes/sun/misc/URLClassPath.java#L82
也许您可以在
sbt.xMain#run
或MyXMain#run
上添加类似于型
以便查看哪个URL为空。
https://www.scala-sbt.org/1.x/docs/Developers-Guide.html显示器
https://github.com/sbt/sbt/blob/1.8.x/DEVELOPING.md显示器