我正试图在一个大罐子里建造一个嵌入式码头。我使用tuto for jetty嵌入式提供休息服务构建了应用程序,我的应用程序中也需要它。现在我尝试添加/包括一个基于jsf的上下文。在Eclipse中一切都很好,但只要使用maven clean install进行部署,并尝试在其他地方执行jar,就会出现以下错误:
线程“main”java.lang.IllegalArgumentException中出现异常:file:///home/debbie/src/main/webapp不是现有目录。 org.eclipse.jetty.util.resource.ResourceCollection.(ResourceCollect.java:108) 在com.example.haa.server.App.start(App.java:43) 在com.example.haa.server.App.main(App.java:62)
我检查了jar,它不包含任何webapp资源,但我不知道如何告诉maven将这些文件包含到jar中,或者如何解决我的问题。
遵循我的简化排练。xml(摆脱这里的依赖关系,因为我不认为这是什么问题。
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.example</groupId> <artifactId>haaa</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>jar</packaging> <name>haaa</name> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <repositories> <repository> <id>prime-repo</id> <name>Prime Repo</name> <url>http://repository.primefaces.org</url> </repository> </repositories> <build> <resources> <resource> <directory>src/main/resources</directory> </resource> <resource> <directory>src/main/webapp</directory> </resource> </resources> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>1.6</version> <configuration> <createDependencyReducedPom>true</createDependencyReducedPom> <filters> <filter> <artifact>*:*</artifact> <excludes> <exclude>META-INF/*.SF</exclude> <exclude>META-INF/*.DSA</exclude> <exclude>META-INF/*.RSA</exclude> </excludes> </filter> </filters> </configuration> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ServicesResourceTransformer" /> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <manifestEntries> <Main-Class>com.example.haaa.server.App</Main-Class> </manifestEntries> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> </project>
然后按照com.example.haa.server.App中的代码:
package com.example.haaa.server; import java.util.HashMap; import java.util.Map; import org.apache.log4j.Logger; import org.eclipse.jetty.security.HashLoginService; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.server.handler.HandlerCollection; import org.eclipse.jetty.servlet.ServletHolder; import org.eclipse.jetty.util.resource.ResourceCollection; import org.eclipse.jetty.webapp.WebAppContext; import org.glassfish.jersey.servlet.ServletContainer; import com.example.haaa.service.AbuseService; public class App { final static Logger logger = Logger.getLogger(App.class); private final Server server; public App() { server = new Server(8080); } public void start() throws Exception { // REST WebAppContext restHandler = new WebAppContext(); restHandler.setResourceBase("./"); restHandler.setClassLoader(Thread.currentThread().getContextClassLoader()); ServletHolder restServlet = restHandler.addServlet(ServletContainer.class, "/abuse/*"); restServlet.setInitOrder(0); Map<String, String> initparams = new HashMap<String, String>(); initparams.put("jersey.config.server.provider.classnames", AbuseService.class.getCanonicalName()+","+"org.glassfish.jersey.filter.LoggingFilter;org.glassfish.jersey.moxy.json.MoxyFeature;org.glassfish.jersey.media.multipart.MultiPartFeature"); restServlet.setInitParameters(initparams); // Web WebAppContext webHandler = new WebAppContext(); webHandler.setResourceAlias("/WEB-INF/classes/", "/classes/"); webHandler.setBaseResource( new ResourceCollection( new String[] { "./src/main/webapp", "./target" })); webHandler.setContextPath("/web/"); HashLoginService loginService = new HashLoginService("HaaaRealm"); loginService.setConfig("./src/main/webapp/loginrealm.txt"); System.out.println(loginService.getConfig()); server.addBean(loginService); // Server HandlerCollection handlers = new HandlerCollection(); handlers.addHandler(webHandler); handlers.addHandler(restHandler); server.setHandler(handlers); server.start(); } public static void main(String[] args) throws Exception { new App().start(); } }
如果我遗漏了任何相关信息,请告诉我。
如果您有 WebAppContext ,您有一个正式的servletwebapp(一个war文件),而不是jar。
WebAppContext
各种 Resource , ResourceBase 和 ResourceCollection 引用必须是完全限定的URI,而不是像您使用的相对路径。(这些参考可以是 jar:file://path/to/my.jar!/path/to/resource URI样式)
Resource
ResourceBase
ResourceCollection
jar:file://path/to/my.jar!/path/to/resource
因为你有2个网络应用,每个都通过 Web应用上下文 ,你会有两场战争。你的胖罐子环境不支持。
Web应用上下文
也许您希望简化,而不是使用 Web应用上下文 以及它附带的所有行李。
如果您使用 ServletContextHandler ,您将能够更轻松地设置uber jar,并支持多个webapp上下文。但您将无法通过 WEB-INF/web.xml 而是依赖编程设置(这包括通过WebAppContext的字节码/注释扫描层发现的任何容器组件)
ServletContextHandler
WEB-INF/web.xml
看看Jetty维护的示例项目
https://github.com/jetty-project/embedded-jetty-uber-jar