improved help and debugging

git-svn-id: svn+ssh://dev.eclipse.org/svnroot/rt/org.eclipse.jetty/jetty/trunk@2490 7e9141cc-0065-0410-87d8-b60c137991c4
This commit is contained in:
Greg Wilkins 2010-11-10 21:04:14 +00:00
parent 834e0ef1d8
commit 095d728f31
4 changed files with 119 additions and 38 deletions

View File

@ -24,6 +24,24 @@
<Arg>org.eclipse.jetty.server.webapp.ContainerIncludeJarPattern</Arg>
<Arg>.*/jsp-api-[^/]*\.jar$|.*/jsp-[^/]*\.jar$</Arg>
</Call>
<!-- Add a customize step to the deployment lifecycle -->
<!-- uncomment and replace DebugBinding with your extended AppLifeCycle.Binding class
<Call name="insertLifeCycleNode">
<Arg>deployed</Arg>
<Arg>starting</Arg>
<Arg>customise</Arg>
</Call>
<Call name="addLifeCycleBinding">
<Arg>
<New class="org.eclipse.jetty.deploy.bindings.DebugBinding">
<Arg>customise</Arg>
</New>
</Arg>
</Call>
-->
</New>
</Arg>
</Call>

View File

@ -0,0 +1,47 @@
// ========================================================================
// Copyright (c) Webtide LLC
// ------------------------------------------------------------------------
// All rights reserved. This program and the accompanying materials
// are made available under the terms of the Eclipse Public License v1.0
// and Apache License v2.0 which accompanies this distribution.
//
// The Eclipse Public License is available at
// http://www.eclipse.org/legal/epl-v10.html
//
// The Apache License v2.0 is available at
// http://www.apache.org/licenses/LICENSE-2.0.txt
//
// You may elect to redistribute this code under either of these licenses.
// ========================================================================
package org.eclipse.jetty.deploy.bindings;
import org.eclipse.jetty.deploy.App;
import org.eclipse.jetty.deploy.AppLifeCycle;
import org.eclipse.jetty.deploy.graph.Node;
import org.eclipse.jetty.server.handler.ContextHandler;
import org.eclipse.jetty.util.log.Log;
public class DebugBinding implements AppLifeCycle.Binding
{
final String[] _targets;
public DebugBinding(String target)
{
_targets=new String[]{target};
}
public DebugBinding(final String... targets)
{
_targets=targets;
}
public String[] getBindingTargets()
{
return _targets;
}
public void processBinding(Node node, App app) throws Exception
{
Log.info("processBinding {} {}",node,app.getContextHandler());
}
}

View File

@ -77,15 +77,7 @@ public class Main
public static void main(String[] args)
{
Main main = new Main();
try
{
main.parseCommandLine(args);
}
catch (Throwable t)
{
t.printStackTrace(System.err);
System.exit(ERR_UNKNOWN);
}
main.parseCommandLine(args);
}
public void parseCommandLine(String[] args)
@ -186,7 +178,7 @@ public class Main
// Output about error is lost in majority of cases.
System.err.println("Unable to create: " + startLog.getAbsolutePath());
// Toss a unique exit code indicating this failure.
System.exit(ERR_LOGGING);
usageExit(ERR_LOGGING);
}
if (!startLog.canWrite())
@ -194,7 +186,7 @@ public class Main
// Output about error is lost in majority of cases.
System.err.println("Unable to write to: " + startLog.getAbsolutePath());
// Toss a unique exit code indicating this failure.
System.exit(ERR_LOGGING);
usageExit(ERR_LOGGING);
}
PrintStream logger = new PrintStream(new FileOutputStream(startLog,false));
System.setOut(logger);
@ -272,7 +264,7 @@ public class Main
if (xmls.contains(arg))
{
System.out.println("WARN: Argument '"+arg+"' specified multiple times. Check start.ini?");
System.out.println("Use java -jar start.jar --help for usage information.");
System.out.println("Use \"java -jar start.jar --help\" for more information.");
}
xmls.add(arg);
}
@ -281,9 +273,7 @@ public class Main
}
catch (Throwable t)
{
t.printStackTrace(System.err);
System.out.println("Use java -jar start.jar --help for usage information.");
System.exit(ERR_UNKNOWN);
usageExit(t,ERR_UNKNOWN);
}
}
@ -294,7 +284,7 @@ public class Main
{
String jettyHome=System.getProperty("jetty.home");
File startIniFile = ini==null?((jettyHome!=null)? new File(jettyHome,"start.ini"):new File("start.ini")):new File(ini);
if (!startIniFile.exists() || !startIniFile.canRead())
if (!startIniFile.exists())
{
if (ini != null)
{
@ -326,8 +316,7 @@ public class Main
}
catch (IOException e)
{
e.printStackTrace(System.err);
System.exit(ERR_UNKNOWN);
usageExit(e,ERR_UNKNOWN);
}
finally
{
@ -345,9 +334,8 @@ public class Main
if (usageStream == null)
{
System.err.println("Usage: java -jar start.jar [options] [properties] [configs]");
System.err.println("ERROR: detailed usage resource unavailable");
System.exit(EXIT_USAGE);
usageExit(EXIT_USAGE);
}
BufferedReader buf = null;
@ -438,7 +426,7 @@ public class Main
}
catch (IOException e)
{
e.printStackTrace(System.err);
usageExit(e,EXIT_USAGE);
}
finally
{
@ -474,9 +462,7 @@ public class Main
if (invoked_class == null)
{
System.err.println("Usage: java -jar start.jar [options] [properties] [configs]");
System.err.println(" java -jar start.jar --help # for more information");
System.exit(ERR_INVOKE_MAIN);
usageExit(ERR_INVOKE_MAIN);
return;
}
}
@ -633,8 +619,7 @@ public class Main
}
catch (Exception e)
{
e.printStackTrace(System.err);
System.exit(ERR_INVOKE_MAIN);
usageExit(e,ERR_INVOKE_MAIN);
}
}
@ -950,8 +935,7 @@ public class Main
}
catch (Exception e)
{
e.printStackTrace(System.err);
System.exit(ERR_SECURITY);
usageExit(e,ERR_SECURITY);
}
}
@ -985,8 +969,7 @@ public class Main
}
catch (Exception e)
{
e.printStackTrace(System.err);
System.exit(ERR_UNKNOWN);
usageExit(e,ERR_UNKNOWN);
}
finally
{
@ -1040,8 +1023,7 @@ public class Main
}
catch (Exception e)
{
e.printStackTrace();
System.exit(ERR_UNKNOWN);
usageExit(e,ERR_UNKNOWN);
return null; // never executed (just here to satisfy javac compiler)
}
finally
@ -1115,13 +1097,28 @@ public class Main
}
catch (ConnectException e)
{
System.err.println("ERROR: Not running!");
System.exit(ERR_NOT_STOPPED);
usageExit(e,ERR_NOT_STOPPED);
}
catch (Exception e)
{
e.printStackTrace(System.err);
System.exit(ERR_UNKNOWN);
usageExit(e,ERR_UNKNOWN);
}
}
static void usageExit(Throwable t, int exit)
{
t.printStackTrace(System.err);
System.err.println();
System.err.println("Usage: java -jar start.jar [options] [properties] [configs]");
System.err.println(" java -jar start.jar --help # for more information");
System.exit(exit);
}
static void usageExit(int exit)
{
System.err.println();
System.err.println("Usage: java -jar start.jar [options] [properties] [configs]");
System.err.println(" java -jar start.jar --help # for more information");
System.exit(exit);
}
}

View File

@ -38,6 +38,7 @@ import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.Set;
import java.util.concurrent.atomic.AtomicReference;
import org.eclipse.jetty.util.LazyList;
import org.eclipse.jetty.util.Loader;
@ -985,9 +986,11 @@ public class XmlConfiguration
* @param args array of property and xml configuration filenames or {@link Resource}s.
*/
@SuppressWarnings( "unchecked" )
public static void main( final String[] args )
public static void main( final String[] args ) throws Exception
{
final AtomicReference<Throwable> exception = new AtomicReference<Throwable>();
AccessController.doPrivileged( new PrivilegedAction()
{
public Object run()
@ -1062,14 +1065,30 @@ public class XmlConfiguration
catch (AccessControlException ace)
{
ace.printStackTrace(System.err);
exception.set(ace);
}
catch ( Exception e )
{
Log.warn( Log.EXCEPTION, e );
Log.debug( Log.EXCEPTION, e );
exception.set(e);
}
return null;
}
} );
Throwable th=exception.get();
if (th!=null)
{
if (th instanceof Exception)
throw (Exception)th;
else if (th instanceof Error)
throw (Error)th;
else if (th instanceof RuntimeException)
throw (RuntimeException)th;
else if (th instanceof ThreadDeath)
throw (ThreadDeath)th;
throw new Error(th);
}
}
}