title: setUncaughtExceptionHandler not working in Maven project
body: <p>I'm trying to handle uncaught exceptions on the main thread in my application so I can log them to a file (my app is a command line app which runs on an overnight job, so if something goes wrong I want admins to be able to easily see exceptions). I've reduced this to as simple a test case as I can.</p>
  
  <p>Maven app generated with (as per the <a href="https://maven.apache.org/guides/getting-started/#How_do_I_make_my_first_Maven_project" rel="noreferrer" title="getting started docs">getting started docs</a>):</p>
  
  <pre><code>   mvn -B archetype:generate \
        -DarchetypeGroupId=org.apache.maven.archetypes \
        -DgroupId=com.mycompany.app \
        -DartifactId=my-app
  </code></pre>
  
  <p>App.java:</p>
  
  <pre><code>package com.mycompany.app;
  
  public class App {
  
      public static void main(String[] args) throws Exception {
          Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
              public void uncaughtException(Thread t, Throwable e) {
                  System.out.println("Handled exception - let's log it!");
                  // Logging code here
              }
          });
  
          System.out.println("Exception testing");
          throw new Exception("Catch and log me!");
      }
  
  }
  </code></pre>
  
  <p>Running with <code>mvn exec:java</code> produces:</p>
  
  <pre><code>[INFO] Error stacktraces are turned on.
  [INFO] Scanning for projects...
  [WARNING] 
  [WARNING] Some problems were encountered while building the effective model for com.mycompany.app:my-app:jar:1.0-SNAPSHOT
  [WARNING] 'build.plugins.plugin.version' for org.codehaus.mojo:exec-maven-plugin is missing. @ line 20, column 15
  [WARNING] 
  [WARNING] It is highly recommended to fix these problems because they threaten the stability of your build.
  [WARNING] 
  [WARNING] For this reason, future Maven versions might no longer support building such malformed projects.
  [WARNING] 
  [INFO]                                                                         
  [INFO] ------------------------------------------------------------------------
  [INFO] Building my-app 1.0-SNAPSHOT
  [INFO] ------------------------------------------------------------------------
  [INFO] 
  [INFO] --- exec-maven-plugin:1.4.0:java (default-cli) @ my-app ---
  Exception testing
  [WARNING] 
  java.lang.reflect.InvocationTargetException
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:606)
      at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
      at java.lang.Thread.run(Thread.java:745)
  Caused by: java.lang.Exception: Catch and log me!
      at com.mycompany.app.App.main(App.java:14)
      ... 6 more
  [INFO] ------------------------------------------------------------------------
  [INFO] BUILD FAILURE
  [INFO] ------------------------------------------------------------------------
  [INFO] Total time: 0.493 s
  [INFO] Finished at: 2015-10-26T10:57:00+00:00
  [INFO] Final Memory: 8M/240M
  [INFO] ------------------------------------------------------------------------
  [ERROR] Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.4.0:java (default-cli) on project my-app: An exception occured while executing the Java class. null: InvocationTargetException: Catch and log me! -&gt; [Help 1]
  org.apache.maven.lifecycle.LifecycleExecutionException: Failed to execute goal org.codehaus.mojo:exec-maven-plugin:1.4.0:java (default-cli) on project my-app: An exception occured while executing the Java class. null
      at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:216)
      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:116)
      at org.apache.maven.lifecycle.internal.LifecycleModuleBuilder.buildProject(LifecycleModuleBuilder.java:80)
      at org.apache.maven.lifecycle.internal.builder.singlethreaded.SingleThreadedBuilder.build(SingleThreadedBuilder.java:51)
      at org.apache.maven.lifecycle.internal.LifecycleStarter.execute(LifecycleStarter.java:128)
      at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:307)
      at org.apache.maven.DefaultMaven.doExecute(DefaultMaven.java:193)
      at org.apache.maven.DefaultMaven.execute(DefaultMaven.java:106)
      at org.apache.maven.cli.MavenCli.execute(MavenCli.java:862)
      at org.apache.maven.cli.MavenCli.doMain(MavenCli.java:286)
      at org.apache.maven.cli.MavenCli.main(MavenCli.java:197)
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:606)
      at org.codehaus.plexus.classworlds.launcher.Launcher.launchEnhanced(Launcher.java:289)
      at org.codehaus.plexus.classworlds.launcher.Launcher.launch(Launcher.java:229)
      at org.codehaus.plexus.classworlds.launcher.Launcher.mainWithExitCode(Launcher.java:415)
      at org.codehaus.plexus.classworlds.launcher.Launcher.main(Launcher.java:356)
  Caused by: org.apache.maven.plugin.MojoExecutionException: An exception occured while executing the Java class. null
      at org.codehaus.mojo.exec.ExecJavaMojo.execute(ExecJavaMojo.java:345)
      at org.apache.maven.plugin.DefaultBuildPluginManager.executeMojo(DefaultBuildPluginManager.java:134)
      at org.apache.maven.lifecycle.internal.MojoExecutor.execute(MojoExecutor.java:208)
      ... 20 more
  Caused by: java.lang.reflect.InvocationTargetException
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
      at java.lang.reflect.Method.invoke(Method.java:606)
      at org.codehaus.mojo.exec.ExecJavaMojo$1.run(ExecJavaMojo.java:293)
      at java.lang.Thread.run(Thread.java:745)
  Caused by: java.lang.Exception: Catch and log me!
      at com.mycompany.app.App.main(App.java:14)
      ... 6 more
  </code></pre>
  
  <p>The same code run as a simple Java app works fine. App.java:</p>
  
  <pre><code>public class App {
  
      public static void main(String[] args) throws Exception {
          Thread.currentThread().setUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() {
              public void uncaughtException(Thread t, Throwable e) {
                  System.out.println("Handled exception - let's log it!");
                  // Logging code here
              }
          });
  
          System.out.println("Exception testing");
          throw new Exception("Catch and log me!");
      }
  
  }
  </code></pre>
  
  <p>Running <code>javac App.java &amp;&amp; java App</code> produces:</p>
  
  <pre><code>Exception testing
  Handled exception - let's log it!
  </code></pre>
  
  <p>I suspect the advice to be given is "you shouldn't have any uncaught exceptions", but I'm not sure I guarantee that and am curious in any case as to the difference between the Maven and non-Maven results.</p>