Как узнать, работаете ли вы внутри демона 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 в командной строке.