Exécuter daemon avec exec-maven-plugin en évitant " IllegalThreadStateException`
j'aimerais lancer un thread de démon qui devrait commencer sur la phase du paquet maven. C'est ce que j'ai dans le 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>
et voici le contenu de la classe 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();
}
}
le thread commence à tourner mais la compilation s'arrête pendant que le thread tourne. Après un certain temps (timeout ou quelque chose) le thread s'arrête et la compilation continue. Est-il là de toute façon je peux obtenir ce fil pour commencer sur le fond et faire la compilation continue sur son propre?
une partie de la sortie de l'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)
je prévois de créer un écouteur de socket pour ce thread et de le laisser vivre en arrière-plan tant que le maven ferme le JVM vers le bas, mais actuellement il semble que le socket ne sera activé que pendant un certain temps au cours de la compilation.
2 réponses
afficher la réponse qui est discutée dans la section des commentaires de la question. Cette solution a fonctionné pour moi! Merci Andrew Logvinov
cleanupDaemonThreads = false
quelque Chose comme cela dans la configuration de la balise
<configuration>
<mainClass>com.test.Startup</mainClass>
<cleanupDaemonThreads>false</cleanupDaemonThreads>
</configuration>
vous pouvez aussi passer cleanupDaemonThreads
en utilisant le paramètre de ligne de commande:
#!/bin/bash
PARAMS="$*"
export MAVEN_OPTS=-Dfile.encoding=utf-8
mvn exec:java \
-Dexec.cleanupDaemonThreads=false \
-Dexec.mainClass="org.mu.App" -Dexec.args="$PARAMS"