我尝试使用嵌入式Jetty部署war文件。您可以在此处克隆最小的工作示例:https://github.com/guilty/jetty-test
当您构建项目并尝试使用jetty-runner(可在此处下载http://mvnrepository.com/artifact/org.eclipse.jetty/jetty-runner/9.2.10.v20150310)运行war-project
时,一切正常。
正如您所看到的,我有jar-project
,它与war-project
(classes
分类符号)有依赖关系。它尝试启动嵌入式Jetty服务器并部署war-project
,但问题是,它读取application-context.xml两次。据我了解,它在类路径中找到它两次:一次在内置* .war中,一次在我使用classes
分类器的依赖中。
如果您使用jetty-runner
并调用Runner.main(new String[] { "path-to.war" })
,也会发生同样的情况,但正如我之前所说,从命令行调用它时工作正常。
所以我的问题是,我猜是如何将classpath限制为Jetty,如果可能的话。
正如我所提到的,这是一个最小的工作示例,而不是真实世界的应用程序。如果我有任何帮助 - 请告诉我。
编辑:我已被要求在此处输入相关代码,因为链接可能已损坏。
由于我没有发布所有代码,我将描述这种情况。我有一个* .war项目,这是一个由spring提供支持的标准Web应用程序。它有一个类,如果spring创建了多个实例,则抛出异常(这应该永远不会发生,因为它的范围是单例)。
另一个项目使用war-project
分类器引用classes
(即获取src/main/java
和src/main/resources
中的所有内容)并尝试部署war-project
生成的war文件{1}}。以下是相关的部署代码:
Server server = new Server(8080);
WebAppContext webAppContext = new WebAppContext(args[0], "/");
server.setHandler(webAppContext);
server.start();
此代码运行,但服务器无法启动,因为我之前编写的bean的第二个实例被创建并引发异常。
war-project
:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:application-context.xml</param-value>
</context-param>
</web-app>
war-project
的application-context.xml只包含一个bean,默认(单例)范围,没有别的。
以下是pom.xml
的相关jar-project
部分:
<dependency>
<groupId>com.github.guilty.jettyTest</groupId>
<artifactId>web-project</artifactId>
<version>1.0-SNAPSHOT</version>
<classifier>classes</classifier>
</dependency>