Как узнать, работаете ли вы внутри демона gradle

У нас есть ситуация, когда мы запускаем экземпляр Jetty внутри виртуальной машины, которая работает в режиме gradle.

Однако это плохо работает, когда мы работаем внутри демона gradle: мы не избавляемся от экземпляра Jetty полностью, поэтому он должен умереть с самим процессом gradle. (Тем не менее, это на самом деле не является большой проблемой, так как в любом случае мы не хотим, чтобы демон gradle использовался в этом тесте интеграции CI).

Итак, мы хотели бы знать, выполняется ли текущая задача внутри демона gradle, или нет - чтобы мы могли выдать исключение или иным образом сообщить пользователю, что это неправильный подход, пожалуйста, запустите этот недемонизированный.

2 ответа

Решение

Gradle называет один из его потоков "Daemon thread", поэтому, если вы разрешите взломать, это может сработать:

def isDaemon = Thread.allStackTraces.keySet.any { it.name.contains "Daemon" };

Другим решением было бы прочитать свойство sun.java.command.

Если вы находитесь в демоне, значение для gradle 2.5 равно

org.gradle.launcher.daemon.bootstrap.GradleDaemon 2.5

и если вы не значение

org.gradle.launcher.GradleMain taskName

так просто

if (System.properties.'sun.java.command'.contains('launcher.daemon')) {
  println 'Daemon is true'
} else {
  println 'Daemon is false'
}

сделал бы тоже самое

Я хотел знать это в контексте плагина Gradle. После проверки источника Gradle я в конце концов нашел ответ, используя:

val daemonScanInfo: DaemonScanInfo? = (project as DefaultProject).services.get(DaemonScanInfo::class.java)
val runningAsDaemon = !daemonScanInfo.isSingleUse

Это имело преимущество, заключающееся в возможности обнаружить --no-daemon а также определение org.gradle.daemon=true|false, дела project.findProperty("org.gradle.jvmargs") не поймал --no-daemon в командной строке.

Другие вопросы по тегам