Предположим, что у вас есть два SBT-проекта, один из которых называется A, а другой - B
A имеет подпроект, называемый макросом, который следует за тем же шаблоном, что и здесь (http://www.scala-sbt.org/0.13.0/docs/Detailed-Topics/Macro-Projects.html). Другими словами, A имеет макрос подпроекта с пакетом, который предоставляет макрос (позволяет назвать его макроопределениями). Теперь оба проекта, A и B, используют пакет macrotools (и A и B являются строго отдельными проектами, B использует A через зависимости в SBT, а A использует publish-local)
Теперь, используя A macrotools пакет в порядке, все работает правильно. Однако, когда B использует пакет macrotools, происходит следующая ошибка.
java.lang.IllegalAccessError: tried to access method com.monetise.waitress.types.Married$.<init>()V from class com.monetise.waitress.types.RelationshipStatus$
Для тех, кто задается вопросом, макросом является этот qaru.site/info/5549/..., так что, другими словами, этот макрос является тем, что находится внутри пакета macrotools
Это также связано с моим предыдущим вопросом Макрозависимость, появляющаяся в 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]
}
Как вы можете видеть, когда я использую комментарии, код работает нормально (задание макроса заключается в заполнении Set всеми объектами в ADT). Когда я использую версию макроса, т.е. SealedContents.values[RelationshipStatus]
, когда я нажимаю java.lang.IllegalAccessError
ИЗМЕНИТЬ
Вот репозиции, содержащие проекты https://github.com/mdedetrich/projectacontainingmacro https://github.com/mdedetrich/projectb
Обратите внимание, что мне пришлось сделать некоторые изменения, о которых я забыл раньше. Поскольку другой проект также должен зависеть от макроса, следующие 2 строки для отключения публикации макросов были прокомментированы
publish := {},
publishLocal := {}
В build.scala. Также обратите внимание, что это время выполнения, а не ошибка времени компиляции
РЕДАКТИРОВАТЬ 2 Создал проблему github здесь https://github.com/sbt/sbt/issues/874