2012-11-20 8 views
22

Ich würde gerne einen Daemon-Thread ausführen, der auf Maven-Paket-Phase starten sollte. Dies ist, was ich in pom.xml haben:Ausführen von Daemon mit exec-maven-plugin Vermeiden von `IllegalThreadStateException`

<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 Faden beginnt zu laufen, aber die Kompilierung stoppt, während der Thread ausgeführt wird. Nach einiger Zeit (Timeout oder etwas) stoppt der Thread und die Kompilierung wird fortgesetzt. Gibt es trotzdem, dass ich diesen Thread im Hintergrund starten kann und die Kompilierung selbstständig fortführen kann?

Einige Ausgabe aus dem 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 plane eine Socket-Listener auf diesen Thread zu erstellen und lassen Sie es so lange im Hintergrund leben, wie die Maven Sie die JVM schließt aber zur Zeit scheint es, die Fassung wird nur für einige Zeit während der Kompilierung aktiviert sein.

+9

Nun, auf den ersten Blick scheint es, dass 'cleanupDaemonThreads' Option für ein solches Verhalten verantwortlich ist. Hast du versucht, es auf false zu setzen? –

+0

oh scheint das hat gut funktioniert. jetzt nur um die eigentliche Umsetzung zu machen .... :) danke! – drodil

+0

Gern geschehen. –

Antwort

38

Veröffentlichen der Antwort, die im Abschnitt Kommentare der Frage diskutiert wird. Diese Lösung hat für mich funktioniert! Dank Andrew Logvinov

cleanupDaemonThreads = false

So etwas wie dies in der Konfigurations-Tag

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

+16

Ich hatte ein ähnliches Problem mit exec: java -Dexec.mainClass = "com.test.Startup" -Dexec.cleanupDaemonThreads = false – Yoztastic