2015-11-05 67 views
0

我有一个java项目,我正在使用嵌入式jetty,而且我还需要将其打包到独立的JAR中。我成功地完成了所有这些工作,并获得了servlet(HelloServlet)以正确响应所有内容。问题是,如果我去根(本例中是8080),我得到一个文件下载。当我检查它时,我注意到它与我的JAR具有相同的大小,所以我将它重命名为.zip并将它打开,看哪,这是我的独立JAR。为什么Jetty独立JAR会自行下载? (与Maven打包在一起)

这是怎么发生的?

我该如何预防? (我是否做错了什么/时髦?)

对结构的评论是受欢迎的,如果有什么不清楚的话我会很乐意提供更多的信息。

/src/main/java/my/package/MyServer.java

package my.package; 

import org.apache.log4j.BasicConfigurator; 
import org.apache.log4j.Logger; 
import org.eclipse.jetty.server.Server; 
import org.eclipse.jetty.webapp.WebAppContext; 

import java.net.URL; 
import java.security.ProtectionDomain; 

public class MyServer 
{ 
    private Server server; 

    private MyServer() {} 

    public static void main(String[] args) throws Exception 
    { 
     BasicConfigurator.configure(); 
     Logger logger = Logger.getLogger("MyServer"); 

     int port = 8080; 

     Server server = new Server(port); 

     logger.info("Server created at port " + port); 

     ProtectionDomain protectionDomain = MyServer.class.getProtectionDomain(); 

     logger.info(protectionDomain); 

     URL url = protectionDomain.getCodeSource().getLocation(); 

     logger.info(url); 

     String rootPath = url.toExternalForm(); 

     logger.info("rootPath: " + rootPath); 

     WebAppContext webAppContext = new WebAppContext(); 
     webAppContext.setContextPath("/"); 
     webAppContext.setResourceBase(rootPath); 
     webAppContext.setParentLoaderPriority(true); 
     webAppContext.setWar(rootPath); 

     webAppContext.addServlet(HelloServlet.class, "/hello"); 

     server.setHandler(webAppContext); 

     try 
     { 
     server.start(); 
     server.join(); 
     } 
     catch (Exception e) 
     { 
     e.printStackTrace(); 
     System.exit(100); 
     } 

    } 
} 

/src/main/java/my/package/HelloServlet.java

package my.package; 

import java.io.IOException; 
import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

public class HelloServlet extends HttpServlet 
{ 
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    { 
     response.setContentType("text/html"); 
     response.setStatus(HttpServletResponse.SC_OK); 
     response.getWriter().println("<h1>Hello Servlet!!!</h1>"); 
     response.getWriter().println("session=" + request.getSession(true).getId()); 
    } 
} 

/pom.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/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>my.package</groupId> 
    <artifactId>myserver</artifactId> 
    <packaging>war</packaging> 
    <version>1.1-SNAPSHOT</version> 
    <name>My Server</name> 
    <url>http://www.fake.nogo</url> 

    <properties> 
    <jettyVersion>9.2.13.v20150730</jettyVersion> 
    </properties> 

    <dependencies> 
    <dependency> 
     <groupId>log4j</groupId> 
     <artifactId>log4j</artifactId> 
     <version>1.2.17</version> 
    </dependency> 
    <dependency> 
     <groupId>org.eclipse.jetty.aggregate</groupId> 
     <artifactId>jetty-all</artifactId> 
     <version>9.2.13.v20150730</version> 
    </dependency> 
    </dependencies> 

    <build> 
    <finalName>myserver</finalName> 

    <plugins> 
     <plugin> 
     <groupId>org.eclipse.jetty</groupId> 
     <artifactId>jetty-maven-plugin</artifactId> 
     <version>9.2.6.v20141205</version> 
     </plugin> 

     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-jar-plugin</artifactId> 
     <version>2.6</version> 
     <executions> 
      <execution> 
      <id>package-jar</id> 
      <phase>package</phase> 
      <goals> 
       <goal>jar</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 

     <plugin> 
     <groupId>org.apache.maven.plugins</groupId> 
     <artifactId>maven-assembly-plugin</artifactId> 
     <version>2.6</version> 
     <configuration> 
      <descriptors> 
      <descriptor>src/main/assembly/distribution.xml</descriptor> 
      </descriptors> 
      <archive> 
      <manifest> 
       <mainClass>my.package.MyServer</mainClass> 
      </manifest> 
      </archive> 
     </configuration> 
     <executions> 
      <execution> 
      <phase>package</phase> 
      <goals> 
       <goal>single</goal> 
      </goals> 
      </execution> 
     </executions> 
     </plugin> 
    </plugins> 
    </build> 
</project> 

/src/main/assembly/distribution.xml

<assembly xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2" 
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
      xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.2 http://maven.apache.org/xsd/assembly-1.1.2.xsd"> 
    <id>standalone</id> 
    <formats> 
     <format>jar</format> 
    </formats> 
    <baseDirectory></baseDirectory> 
    <dependencySets> 
     <dependencySet> 
      <unpack>true</unpack> 
     </dependencySet> 
    </dependencySets> 
</assembly> 

/src/main/webapp/WEB-INF/web.xml

<!DOCTYPE web-app PUBLIC 
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 
"http://java.sun.com/dtd/web-app_2_3.dtd" > 

<web-app> 
    <display-name>My Server</display-name> 

    <servlet> 
     <servlet-name>default</servlet-name> 
     <servlet-class>org.eclipse.jetty.servlet.DefaultServlet</servlet-class> 
     <init-param> 
      <param-name>dirAllowed</param-name> 
      <param-value>false</param-value> 
     </init-param> 
    </servlet> 

</web-app> 

我做mvn clean package然后java -jar target/myserver-standalone.jar运行它。

+0

什么记录为您ROOTPATH?如果你从一个jar开始你的应用程序,它应该是一个文件:url指向jar,而不是包含jar的文件夹。我想用这个URL作为资源库应该是你问题的原因。 –

+0

@MichaelKoch谢谢你的回应!记录的rootPath实际上指向独立的jar(否则我猜HelloServlet将无法工作?) – bananpermobil

+0

我设法让它工作,通过废除所有东西并从此构建 - > https://github.com/thomasWeise/standAloneJSPsWithJetty – bananpermobil

回答

0

尝试配置Maven的组装插件这种方式:

<groupId>org.apache.maven.plugins</groupId> 
<artifactId>maven-assembly-plugin</artifactId> 
<version>2.6</version> 
<configuration> 
    <descriptorRefs> 
     <descriptorRef>jar-with-dependencies</descriptorRef> 
    </descriptorRefs> 
    <finalName>myserver-standalone</finalName> 
    <appendAssemblyId>false</appendAssemblyId> 
    <archive> 
     <manifest> 
      <mainClass>my.package.MyServer</mainClass> 
     </manifest> 
    </archive> 
</configuration> 
+0

感谢您的回应!我尝试了你的解决方案,并从我的开始解决方案中添加了执行标签(否则它不会构建最终的独立jar)。但它的工作原理与我的初始解决方案一样。 – bananpermobil

相关问题