2012-11-20 10 views
22

Chciałbym uruchomić wątek demona, który powinien wystartować w fazie pakietu maven. To jest to, co mam w pom.xml:Działający demon z exec-maven-plugin omijający `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> 

A oto treść Uruchomienie klasy:

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(); 
    } 
} 

Gwint zaczyna biec, ale zatrzymuje się podczas kompilacji wątek jest uruchomiony. Po pewnym czasie (timeout lub coś w tym stylu) wątek zatrzymuje się i kompilacja trwa. Czy mimo to mogę uruchomić ten wątek w tle i kontynuować kompilację?

Niektóre wyjście z 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) 

Mam zamiar stworzyć słuchacza gniazda do tego wątku i pozwolić mu żyć w tle tak długo, jak Maven zamyka JVM w dół, ale obecnie wydaje się, że gniazdo będzie włączony tylko przez pewien czas podczas kompilacji.

+9

Cóż, na pierwszy rzut oka wydaje się, że opcja 'cleanupDaemonThreads' jest odpowiedzialny za takie zachowanie. Czy próbowałeś ustawić na false? –

+0

oh wydaje się, że działało dobrze. teraz po prostu do rzeczywistej realizacji .... :) dzięki! – drodil

+0

Nie ma za co. –

Odpowiedz

38

Zamieszczanie odpowiedzi omówionej w sekcji komentarzy na pytanie. To rozwiązanie sprawdziło się! Dzięki Andrew Logvinov

cleanupDaemonThreads = false

Coś takiego w tagu konfiguracji

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

+16

Miałem podobny problem z exec: java -Dexec.mainClass = "com.test.Startup" -Dexec.cleanupDaemonThreads = false – Yoztastic

Powiązane problemy