使用maven和jetty创建一个可执行的jar



我想使用jetty启动我的应用程序,所以我添加了下面提到的依赖项。当我运行主方法时,Jetty成功启动。(我正在做一个struts2+spring3+hibernate maven项目,我也可以在tomcat中部署它)

现在我想从战争包装pom创建一个可执行的jar。因此,我在pom中添加了maven汇编插件。(我尝试了maven jar插件,但它没有添加依赖项)

来源

插件

<build>
    <plugins>
        <plugin>
        <artifactId>maven-war-plugin</artifactId>
        <version>2.3</version>
        <configuration>
                 <archive>
            <manifest>
        <mainClass>com.dca.engine.StartDCA</mainClass>
            </manifest>
             </archive>
        <packagingExcludes>WEB-INF/lib/jetty*.jar,WEB-INF/lib/org.apache.taglibs.standard.glassfish*.jar,WEB-INF/lib/org.apache.jasper.glassfish*.jar,WEB-INF/lib/org.eclipse.jdt.core*.jar,WEB-INF/lib/javax.servlet.jsp*.jar,WEB-INF/lib/javax.el*.jar</packagingExcludes>
        <escapeString></escapeString>
        </configuration>
       </plugin>
       <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-assembly-plugin</artifactId>
        <version>2.4</version>
        <configuration>
                 <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                 </descriptorRefs>
             <archive>
            <manifest>
        <mainClass>com.dca.engine.StartDCA</mainClass>
            </manifest>
             </archive>
        </configuration>
        <executions>
             <execution>
                    <id>make-assembly</id>
                    <phase>package</phase>
                    <goals>
                      <goal>single</goal>
                    </goals>
             </execution>
        </executions>
    </plugin>
 </plugins>
<resources>
    <resource>
        <directory>src/main/java</directory>
        <includes>
        <include>**/*.java</include>
        <include>**/*.xml</include>
        </includes>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
        <filtering>true</filtering>
    </resource>
</resources>
</build>

嵌入式码头

<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-server</artifactId>
    <version>8.1.10.v20130312</version>
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-webapp</artifactId>
    <version>8.1.10.v20130312</version>
    <!-- <scope>provided</scope> -->
</dependency>
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-jsp</artifactId>
    <version>8.1.10.v20130312</version>
    <!-- <scope>provided</scope>  -->
</dependency> 

主要方法

 Server server = new Server(8080);
        System.setProperty("is_DCA", "YES");
        WebAppContext webAppContext = new WebAppContext();
        webAppContext.setResourceBase("/home/myfolder/workspace/app/dca/src/main/webapp");
        webAppContext.setDescriptor("/home/myfolder/workspace/app/dca/src/main/webapp/WEB-INF/web.xml");
        webAppContext.setContextPath("/app");
        server.setHandler(webAppContext);
        server.start();
        server.join();

启动应用程序

我用java-jar/home/myfolder/workspace/app/dca/target/app-dca-1.0-jar-with-dependences.jar 运行创建的jar

码头启动异常。

INFO  10-12 15:03:01,609 - jetty-8.y.z-SNAPSHOT
INFO  10-12 15:03:01,776 - Initializing Spring root WebApplicationContext
INFO  10-12 15:03:01,776 - Root WebApplicationContext: initialization started
INFO  10-12 15:03:01,843 - Refreshing Root WebApplicationContext: startup date [Tue Dec 10 15:03:01 IST 2013]; root of context hierarchy
INFO  10-12 15:03:01,885 - Loading XML bean definitions from class path resource [applicationContext-dca.xml]
ERROR 10-12 15:03:05,725 - Context initialization failed
org.springframework.beans.factory.parsing.BeanDefinitionParsingException: Configuration problem: Unable to locate Spring NamespaceHandler for XML schema namespace [http://www.springframework.org/schema/util]
Offending resource: class path resource [applicationContext-dca.xml]
    at org.springframework.beans.factory.parsing.FailFastProblemReporter.error(FailFastProblemReporter.java:68)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:85)
    at org.springframework.beans.factory.parsing.ReaderContext.error(ReaderContext.java:80)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.error(BeanDefinitionParserDelegate.java:316)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1420)
    at org.springframework.beans.factory.xml.BeanDefinitionParserDelegate.parseCustomElement(BeanDefinitionParserDelegate.java:1413)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.parseBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:184)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.doRegisterBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:140)
    at org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader.registerBeanDefinitions(DefaultBeanDefinitionDocumentReader.java:111)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.registerBeanDefinitions(XmlBeanDefinitionReader.java:493)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.java:390)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    at org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:302)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:174)
    at org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:209)

有没有一种可能的方法,我可以使用战争创造的码头。它在/WEB-INF/lib/文件夹中有jar,所有属性文件和xml文件都在/WEB-INF/lib/中,我尝试运行war

java-jar/home/myfolder/workspace/app/dca/target/app-dca-1.0.war

但它无法定位主类。

在创建可执行的战争检查sumit的答案时工作

我得到了这个问题的例外。当我将jetty版本替换为7.6.7.v20120910时,它起到了的作用

我不知道为什么它不适用于jetty 8.1.10.v20130312

如果您不想使用Jetty,而是对使用Tomcat持开放态度,那么以下操作将非常有效:

<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.0</version>
    <executions>
        <execution>
            <id>tomcat-run</id>
            <goals>
                <goal>exec-war-only</goal>
            </goals>
            <phase>package</phase>
            <configuration>
                <path>/standalone</path>
                <enableNaming>false</enableNaming>
                <finalName>standalone.jar</finalName>
                <charset>utf-8</charset>
            </configuration>
        </execution>
    </executions>
</plugin>

这将创建一个名为"standalone.jar"的uberjar,然后只需调用即可运行它

java -jar standalone.jar

这将在上启动应用程序http://localhost:8080/standalone

选择备用端口很容易

java -jar standalone.jar -httpPort=7070

感谢Tomasz Nurkiewicz的博客文章强调了这一点http://www.nurkiewicz.com/2012/11/standalone-web-application-with.html

您可以使用maven shade插件创建一个可执行的JAR文件,而不是像公认的答案那样对WAR文件的内容进行黑客攻击。这具有以下优点:

  • 该插件包含用于合并META-INF/services、LICENSE和README文件内容的"转换器"
  • 您最终得到一个JAR文件。WAR文件并没有被设计成可执行的(尽管它是有效的)
  • 通过将所有依赖项拆包到同一个JAR文件中,您将被迫删除重复的类,并使内容更难进行反向工程

看看http://uguptablog.blogspot.com/2012/09/embedded-jetty-executable-war-with.html

相关代码为

    ProtectionDomain domain = Main.class.getProtectionDomain();
    URL location = domain.getCodeSource().getLocation();
    WebAppContext webapp = new WebAppContext();
    webapp.setContextPath("/");
    webapp.setWar(location.toExternalForm());
    server.setHandler(webapp);

希望能有所帮助。

我知道(但从未尝试过)最简单的方法是winstone maven插件,就像Jenkins CI所做的那样(多么好的例子:D)。它不使用Jetty(甚至我喜欢这个工具:D),而是使用Winstone。

Maven插件使用情况

<plugin>
    <groupId>net.sf.alchim</groupId>
    <artifactId>winstone-maven-plugin</artifactId>
    <executions>
        <execution>
            <goals>
                <goal>embed</goal>
            </goals>
            <phase>package</phase>
        </execution>
    </executions>
</plugin>

很容易,不是吗?:)它将生成一个可执行的独立jar:app-dca-1.0-standalone.jar

文件

  • Winstone Servlet容器:http://winstone.sourceforge.net/
  • Winstone Maven插件:http://alchim.sourceforge.net/winstone-maven-plugin/usage.html
  • 完整示例:http://www.jayway.com/2008/11/28/executable-war-with-winstone-maven-plugin/

相关内容

最新更新