Lo que intento hacer es construir un archivo ejecutable JAR
que contendrá mi proyecto. He incluido sus dependencias junto a él, también en JAR
archivos, por lo que mi listado de directorios es como la siguiente:Iniciar el servidor de embarcadero incrustado para un archivo JAR
~/Projects/Java/web-app/out:
web-app.jar
dependency1.jar
dependency2.jar
dependency3.jar
que sé y estoy seguro de que mi problema no surge de las dependencias, como mis funciones de aplicación adecuada , hasta el momento en que empiezo Jetty embedded.
El código que utilizo para iniciar Jetty es así:
public class ServerExecutionGoal implements ExecutionGoal {
private final static Logger logger = Logger.getLogger(ServerExecutionGoal.class);
private WebAppContext getWebAppContext() throws IOException {
WebAppContext context = new WebAppContext();
System.out.println("context = " + context);
context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm());
context.setContextPath("/");
context.setLogger(new StdErrLog());
return context;
}
@Override
public void execute(Map<String, Object> stringObjectMap) throws ExecutionTargetFailureException {
logger.info("Instantiating target server ...");
final Server server = new Server(8089);
final ContextHandlerCollection handlerCollection = new ContextHandlerCollection();
try {
handlerCollection.setHandlers(new Handler[]{new RequestLogHandler(), getWebAppContext()});
} catch (IOException e) {
throw new ExecutionTargetFailureException("Could not create web application context", e);
}
server.setHandler(handlerCollection);
try {
logger.info("Starting server on port 8089 ...");
server.start();
server.join();
logger.info("Server started. Waiting for requests.");
} catch (Exception e) {
throw new ExecutionTargetFailureException("Failed to properly start the web server", e);
}
}
public static void main(String[] args) throws ExecutionTargetFailureException {
new ServerExecutionGoal().execute(null);
}
}
puedo validar que la carpeta "aplicación web" se trasladó correctamente dentro de mi JAR a /webapp
, y que cuando se ejecuta el código a través de mi IDE (IntelliJ IDEA 11) context.setResourceBase(new PathMatchingResourcePatternResolver().getResource("classpath:/webapp").getURL().toExternalForm())
mapas válidamente para el recurso en cuestión. Además, puedo demostrar que resuelve algo así como:
jar:file:~/Projects/Java/web-app/out/web-app.jar!/webapp
y es accesible (Lo leí).
Sin embargo, cuando comienzo método principal de mi solicitud, y embarcadero aperturas, en http://localhost:8089
me sale el siguiente:
HTTP ERROR: 503
Problem accessing /. Reason:
Service Unavailable
Powered by Jetty://
Dónde estoy haciendo mal?
Lo sé estableciendo "resourceBase" en "." la dirección "http://localhost:8089
" actuará como una interfaz para la ubicación "~/Projects/Java/web-app/out/
" donde puedo ver una lista de todos los archivos JAR
, incluido el "web-app.jar
", al hacer clic en el que me ofrecen para descargarlo.
he visto las siguientes preguntas, y las respuestas no se aplican:
- Embedded jetty application not working from jar: Me NullPointerException desde
Start.class.getProtectionDomain().getCodeSource()
resuelve anull
. - Embedded Jetty WebAppContext FilePermission issue: que no solo no se responde, pero la situación claramente no se aplica, ya que no tengo problemas de permisos (el hecho de que pueda obtener una lista de archivos debería probar eso).
- embedding jetty server problems: también sin respuesta, tampoco aplicable ya que no tengo ningún problema de dependencia (como se señaló anteriormente en mis comentarios anteriores).
creo que de alguna manera yo debería permitir embarcadero para acceder a la carpeta /webapp
, que se encuentra bajo mi directorio src/main/resources/
y se metieron en mi aplicación web. ¿Debo abandonar una aplicación web incluida y desplegar la ruta de contexto explotada en algún lugar accesible por Jetty en su lugar (esto no es deseable en absoluto, ya que plantea una multitud de problemas para mí y para mis clientes).
Usted podría utilizar context.setWar (...) con un archivo WAR. Esto solo agregaría un archivo a su distribución. –
También estoy enfrentando un problema similar. Cuando el servidor se inicia desde eclipse obtengo la respuesta adecuada para la solicitud. Pero cuando lo ejecuto desde un archivo jar de cmd, obtengo 404. Cualquier ayuda es apreciada. –