2 つの SBT プロジェクトがあり、1 つは A と呼ばれ、もう 1 つは B と呼ばれるとします。
A にはマクロと呼ばれるサブプロジェクトがあり、ここ ( http://www.scala-sbt.org/0.13.0/docs/Detailed-Topics/Macro-Projects.html )とまったく同じパターンに従います。つまり、A には、マクロを公開するパッケージを含むサブプロジェクト マクロがあります (これを macrotools と呼びます)。現在、プロジェクト A と B の両方が macrotools パッケージを使用しています (そして、A と B は厳密に別のプロジェクトであり、B は SBT の依存関係を介して A を使用し、A は publish-local を使用しています)。
これで、A の macrotools パッケージを使用した A は問題なく、すべてが正しく動作します。しかし、B が A の macrotools パッケージを使用すると、次のエラーが発生します。
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、つまり、このマクロはマクロツールパッケージの中にあるものです
これは、私が現在 SBT 0.13 を使用していることと、SBT 0.13 の変更されたガイドに従っていることを除いて、以前の質問のマクロ依存関係が POM/JAR に表示されることにも関連しています。
上記で参照されているコードは、この場合、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]
}
ご覧のとおり、コメントしたものを使用すると、コードは正常に動作します (マクロの仕事は、ADT 内のすべてのケース オブジェクトで Set を埋めることです)。マクロ バージョンを使用する場合、SealedContents.values[RelationshipStatus]
つまりjava.lang.IllegalAccessError
編集
プロジェクトを含むリポジトリ は次のとおり です
以前に忘れていたいくつかの変更を行う必要があったことに注意してください。他のプロジェクトもマクロに依存する必要があるため、マクロの公開を無効にする次の 2 行はコメント アウトされています。
publish := {},
publishLocal := {}
build.scala で。また、これはコンパイル時エラーではなく実行時エラーであることに注意してください
EDIT 2 ここにgithubの問題を作成しましたhttps://github.com/sbt/sbt/issues/874