Запуск демона с помощью exec-maven-plugin, избегая `IllegalThreadStateException`

Я хотел бы запустить поток демона, который должен начаться на этапе пакета maven. Это то, что у меня есть в pom.xml:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>exec-maven-plugin</artifactId>
            <version>1.2.1</version>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>java</goal>
                    </goals>
                </execution>                                
            </executions>
            <configuration>
                 <mainClass>com.test.Startup</mainClass>
                 <cleanupDaemonThreads>true</cleanupDaemonThreads>
            </configuration>
       </plugin>
  </plugins>
</build>

А вот содержимое класса Startup:

public class Startup {

    public static class Testing extends Thread {
        @Override
        public void run() {
            while(true) {
                System.out.println("testing..");
            }
        }
    }

    public static void main(String[] list) throws Exception {
        Testing t = new Testing();
        t.setDaemon(true);
        t.start();
    }
}

Поток запускается, но компиляция останавливается во время выполнения потока. Через некоторое время (тайм-аут или что-то в этом роде) поток останавливается, и компиляция продолжается. Могу ли я в любом случае запустить этот поток в фоновом режиме и продолжить компиляцию самостоятельно?

Некоторый вывод из maven:

[WARNING] thread Thread[Thread-1,5,com.test.Startup] was interrupted but is still alive after waiting at least 15000msecs
[WARNING] thread Thread[Thread-1,5,com.test.Startup] will linger despite being asked to die via interruption
[WARNING] NOTE: 1 thread(s) did not finish despite being asked to  via interruption. This is not a problem with exec:java, it is a problem with the running code. Although not serious, it should be remedied.
[WARNING] Couldn't destroy threadgroup org.codehaus.mojo.exec.ExecJavaMojo$IsolatedThreadGroup[name=com.test.Startup,maxpri=10]
java.lang.IllegalThreadStateException
    at java.lang.ThreadGroup.destroy(ThreadGroup.java:754)
    at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:334)
    at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:101)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:209)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:153)
    at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:145)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:84)
    at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:59)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.singleThreadedBuild(LifecycleStarter.java:183)
    at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:161)
    at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:320)
    at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:156)
    at org.apache.maven.cli.MavenCli.execute(MavenCli.java:537)
    at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:196)
    at org.apache.maven.cli.MavenCli.main(MavenCli.java:141)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:290)
    at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:230)
    at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:409)
    at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:352)

Я планирую создать прослушиватель сокетов для этого потока и позволить ему жить в фоновом режиме, пока maven выключает JVM, но в настоящее время кажется, что сокет будет включен только в течение некоторого времени во время компиляции.


person drodil    schedule 20.11.2012    source источник
comment
Что ж, на первый взгляд кажется, что за такое поведение отвечает опция cleanupDaemonThreads. Вы пытались установить его в false?   -  person Andrew Logvinov    schedule 20.11.2012
comment
о, кажется, это сработало просто отлично. теперь просто сделать фактическую реализацию.... :) спасибо!   -  person drodil    schedule 20.11.2012
comment
У меня была похожая проблема с ExecJavaMojo, выполнение в командном городе через цели. exec:java -Dexec.mainClass=com.test.Startup Плагин по умолчанию был вызван, так как в файле pom не было переопределения. Ваше предложение помогло exec:java -Dexec.mainClass=com.test.Startup -Dexec.cleanupDaemonThreads=false   -  person Yoztastic    schedule 28.10.2014


Ответы (2)


Публикация ответа, который обсуждается в разделе комментариев к вопросу. Это решение сработало для меня! Спасибо Андрей Логвинов

cleanupDaemonThreads = ложь

Что-то вроде этого в теге конфигурации

<configuration> <mainClass>com.test.Startup</mainClass> <cleanupDaemonThreads>false</cleanupDaemonThreads> </configuration>

person Vykunta    schedule 06.08.2014
comment
У меня была похожая проблема с exec:java -Dexec.mainClass=com.test.Startup -Dexec.cleanupDaemonThreads=false - person Yoztastic; 28.10.2014
comment
Спасибо, сэр! некоторое время боролся с этим. - person Krik; 20.02.2019

Вы также можете передать cleanupDaemonThreads, используя параметр командной строки:

#!/bin/bash

PARAMS="$*"

export MAVEN_OPTS=-Dfile.encoding=utf-8

mvn exec:java \ 
     -Dexec.cleanupDaemonThreads=false \ 
     -Dexec.mainClass="org.mu.App" -Dexec.args="$PARAMS"
person freedev    schedule 07.05.2018