从另一个模块访问 Scala private 类
Accessing Scala private classes from another module
我有一个 Scala/Spark 项目(使用 Maven 构建),我想在其中执行以下操作。
我想修改org.apache.spark.mllib.recommendations.ALS
,所以我将该文件的源代码复制到我自己的包中:org.apache.spark.mllib.myrecommendations.ALS
。但是,它依赖于一些 类,如 org.apache.spark.util.Utils
,它们被声明为 private[spark]
。
我曾希望通过将我的代码放在 org.apache.spark
中,它能够访问私有成员。但它在抱怨,也许是因为 Spark 是通过 Maven 模块导入的?我该如何解决这个问题?
下面是 pom.xml 导入 spark-mllib 的方式:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.10</artifactId>
<version>1.1.0</version>
<scope>provided</scope>
</dependency>
这是我 运行 进入的错误消息示例:
error: variable checkpointDir in class SparkContext cannot be accessed in org.apache.spark.SparkContext
[WARNING] if (sc.checkpointDir.isDefined && (iter % 3 == 0)) {
[WARNING] ^
查看 org.apache.spark.SparkContext 的源代码,我看到 checkpointDir 被声明为私有 org.apache.spark:
private[spark] var checkpointDir: Option[String] = None
为什么我无法访问此成员,即使我的代码在 org.apache.spark.mllib.myrecommendation.ALS,org.apache.spark 的子项中?
请不要试图在任何编程语言中违反可见性和可访问性规则。如果您真的需要更改 Spark 源代码中的某些内容,而这些内容不是为之设计的,安全的方法是:
- 克隆源代码
- 应用修改
- 在您的本地 Maven 存储库中构建和发布(更改工件标识符中的某些内容)
- 更新您的 pom.xml 以引用您创建的新版本
Spark 测试作为构建的一部分执行,希望如果您的修改引入错误,您会发现它,因为测试失败。
对我有用。
因为包是打开的,所以按照您描述的方式添加到它们是完全没问题的(从密封的 jar 文件中模加载)。
一个简单的 sbt 项目 ALS.scala 修改为位于包 recommendation2
中(并修复了几个 private[recommendation2]
)并导入 org.apache.spark.mllib.recommendation.MatrixFactorizationModel
.
build.sbt:
scalaVersion := "2.10.3"
scalacOptions ++= Seq("-Xlint", "-deprecation")
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.10" % "1.2.0",
"org.apache.spark" % "spark-mllib_2.10" % "1.2.0",
"junit" % "junit" % "4.12" % "test"
)
然后
$ sbt compile
[info] Set current project to SparkHack (in build file:/home/apm/tmp/spark-hack/)
[info] Updating {file:/home/apm/tmp/spark-hack/}spark-hack...
[info] Resolving [snip]...
[info] Done updating.
[info] Compiling 1 Scala source to /home/apm/tmp/spark-hack/target/scala-2.10/classes...
[success] Total time: 22 s, completed Jan 19, 2015 9:10:03 AM
我有一个 Scala/Spark 项目(使用 Maven 构建),我想在其中执行以下操作。
我想修改org.apache.spark.mllib.recommendations.ALS
,所以我将该文件的源代码复制到我自己的包中:org.apache.spark.mllib.myrecommendations.ALS
。但是,它依赖于一些 类,如 org.apache.spark.util.Utils
,它们被声明为 private[spark]
。
我曾希望通过将我的代码放在 org.apache.spark
中,它能够访问私有成员。但它在抱怨,也许是因为 Spark 是通过 Maven 模块导入的?我该如何解决这个问题?
下面是 pom.xml 导入 spark-mllib 的方式:
<dependency>
<groupId>com.sparkjava</groupId>
<artifactId>spark-core</artifactId>
<version>2.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_2.10</artifactId>
<version>1.1.0</version>
<scope>provided</scope>
</dependency>
这是我 运行 进入的错误消息示例:
error: variable checkpointDir in class SparkContext cannot be accessed in org.apache.spark.SparkContext
[WARNING] if (sc.checkpointDir.isDefined && (iter % 3 == 0)) {
[WARNING] ^
查看 org.apache.spark.SparkContext 的源代码,我看到 checkpointDir 被声明为私有 org.apache.spark:
private[spark] var checkpointDir: Option[String] = None
为什么我无法访问此成员,即使我的代码在 org.apache.spark.mllib.myrecommendation.ALS,org.apache.spark 的子项中?
请不要试图在任何编程语言中违反可见性和可访问性规则。如果您真的需要更改 Spark 源代码中的某些内容,而这些内容不是为之设计的,安全的方法是:
- 克隆源代码
- 应用修改
- 在您的本地 Maven 存储库中构建和发布(更改工件标识符中的某些内容)
- 更新您的 pom.xml 以引用您创建的新版本
Spark 测试作为构建的一部分执行,希望如果您的修改引入错误,您会发现它,因为测试失败。
对我有用。
因为包是打开的,所以按照您描述的方式添加到它们是完全没问题的(从密封的 jar 文件中模加载)。
一个简单的 sbt 项目 ALS.scala 修改为位于包 recommendation2
中(并修复了几个 private[recommendation2]
)并导入 org.apache.spark.mllib.recommendation.MatrixFactorizationModel
.
build.sbt:
scalaVersion := "2.10.3"
scalacOptions ++= Seq("-Xlint", "-deprecation")
libraryDependencies ++= Seq(
"org.apache.spark" % "spark-core_2.10" % "1.2.0",
"org.apache.spark" % "spark-mllib_2.10" % "1.2.0",
"junit" % "junit" % "4.12" % "test"
)
然后
$ sbt compile
[info] Set current project to SparkHack (in build file:/home/apm/tmp/spark-hack/)
[info] Updating {file:/home/apm/tmp/spark-hack/}spark-hack...
[info] Resolving [snip]...
[info] Done updating.
[info] Compiling 1 Scala source to /home/apm/tmp/spark-hack/target/scala-2.10/classes...
[success] Total time: 22 s, completed Jan 19, 2015 9:10:03 AM