1

假设你有两个 SBT 项目,一个叫 A,另一个叫 B

A 有一个名为宏的子项目,它遵循与此处显示的完全相同的模式 ( http://www.scala-sbt.org/0.13.0/docs/Detailed-Topics/Macro-Projects.html )。换句话说,A 有一个子项目宏,其中包含一个公开宏的包(我们称之为宏工具)。现在两个项目 A 和 B 都使用宏工具包(并且 A 和 B 是严格独立的项目,B 通过 SBT 中的依赖项使用 A,A 使用本地发布)

现在,A 使用 A 的 macrotools 包很好,一切正常。但是当 B 使用 A 宏工具包时,会发生以下错误

java.lang.IllegalAccessError: tried to access method com.monetise.waitress.types.Married$.<init>()V from class com.monetise.waitress.types.RelationshipStatus$

对于那些想知道的人,宏就是这个https://stackoverflow.com/a/13672520/1519631,换句话说,这个宏就是宏工具包里面的东西

这也与我之前在 POM/JAR 中出现的问题宏依赖有关,除了我现在使用的是 SBT 0.13,并且我正在遵循 SBT 0.13 的更改指南

上面提到的代码是,在这种情况下,这是 B 中的内容,而 A 是com.monetise.incredients.macros.tools(这是 build.sbt 中指定的依赖项)

package com.monetise.waitress.types
import com.monetise.ingredients.macros.tools.SealedContents

sealed abstract class RelationshipStatus(val id:Long, val formattedName:String)
case object Married extends RelationshipStatus(0,"Married")
case object Single extends RelationshipStatus(1,"Single")

object RelationshipStatus {
//  val all:Set[RelationshipStatus] = Set(
//      Married,Single
//  )

  val all:Set[RelationshipStatus] = SealedContents.values[RelationshipStatus]
}

如您所见,当我使用 whats commented 时,代码工作正常(宏的工作是用 ADT 中的所有案例对象填充 Set)。当我使用宏版本时,即SealedContents.values[RelationshipStatus]当我点击java.lang.IllegalAccessError

编辑

这里是包含项目的仓库 https://github.com/mdedetrich/projecta containsmacro https://github.com/mdedetrich/projectb

请注意,我必须做一些我之前忘记的更改。因为其他项目也需要依赖宏,所以以下2行禁用宏发布已被注释掉

publish := {},
publishLocal := {}

在 build.scala 中。另请注意,这是一个运行时,而不是编译时错误

编辑 2 在这里创建了一个 github 问题https://github.com/sbt/sbt/issues/874

4

1 回答 1

2

此问题与 SBT 无关。它看起来像是来自迭代的宏,而不是 Scala 中的密封特征?你正在使用的有一个错误。按照链接查看修复。

于 2013-09-15T19:01:47.637 回答