Daemon mit dem exec-maven-plugin Vermeidung von `IllegalThreadStateException`
Ich würde gerne einen daemon-thread, der sollte beginnen, auf der maven Paket-phase. Dies ist, was ich in 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>
Und hier ist der Inhalt der Klasse 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();
}
}
Der thread beginnt zu laufen, aber das kompilieren beendet, während der thread ausgeführt wird. Nach einiger Zeit (timeout oder so) der thread gestoppt und die Zusammenstellung weiter. Gibt es trotzdem kann ich diesen thread zu starten, auf den hintergrund und machen die Zusammenstellung selbst Fort?
Ausgabe von 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)
Ich bin Planung zu erstellen, die ein socket-listener auf diesen thread und lass Sie Leben in den hintergrund, solange die maven, schaltet der JVM unten, aber derzeit scheint es die Buchse nur für einige Zeit während der Kompilierung.
- Gut, auf den ersten Blick scheint es, dass
cleanupDaemonThreads
option ist verantwortlich für ein solches Verhalten. Haben Sie versucht, ihn auf false setzen? - oh, scheint, dass hat Prima funktioniert. jetzt nur noch um die tatsächliche Umsetzung.... 🙂 vielen Dank!
- Du bist herzlich willkommen.
- Ich hatte ein ähnliches problem mit ExecJavaMojo, Ausführung in team Stadt über Ziele. "exec:java -Dexec.mainClass="com.test.Start" Die Standard-Plug-in aufgerufen wurde, wie es war "kein Vorrang" in der pom-Datei. Ihren Vorschlag hat den trick "exec:java -Dexec.mainClass="com.test.Startup" -Dexec.cleanupDaemonThreads=false"
Du musst angemeldet sein, um einen Kommentar abzugeben.
Posting die Antwort, diskutiert wird in den Kommentaren die Frage.
Diese Lösung funktionierte für mich! Dank Andrew Logvinov
So etwas in der configuration-tag
<configuration>
<mainClass>com.test.Startup</mainClass>
<cleanupDaemonThreads>false</cleanupDaemonThreads>
</configuration>
Können Sie auch pass
cleanupDaemonThreads
mithilfe des command-line-parameter: