使用maven和jetty创建一个可执行jar
我想使用jetty启动我的应用程序,所以我添加了下面提到的依赖项。 当我运行主方法Jetty成功启动。(我正在开发一个struts2 + spring3 + hibernate maven项目,我也可以在tomcat中部署它)
现在我想从战争包装pom创建一个可执行jar。 所以我在我的pom中添加了maven-assembly-plugin 。 (我尝试使用maven jar插件,但它没有添加依赖项)
来源
插件
maven-war-plugin 2.3 com.dca.engine.StartDCA 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 \ org.apache.maven.plugins maven-assembly-plugin 2.4 jar-with-dependencies com.dca.engine.StartDCA make-assembly package single src/main/java **/*.java **/*.xml src/main/resources true
嵌入式Jetty
org.eclipse.jetty jetty-server 8.1.10.v20130312 org.eclipse.jetty jetty-webapp 8.1.10.v20130312 <!-- provided --> org.eclipse.jetty jetty-jsp 8.1.10.v20130312 <!-- provided -->
主要方法
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-dependencies.jar运行创建的jar
docker始于例外。
INFO 10-12 15:03:01,609 - jetty-8.yz-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)
有没有可能的方法,我可以使用创建的战争开始docker。 它在/ WEB-INF / lib /文件夹中有jar,所有属性文件和xml文件都在/ WEB-INF / lib /中我试过运行战争
java -jar /home/myfolder/workspace/app/dca/target/app-dca-1.0.war
但它无法找到主类。
在创建可执行的战争检查sumit的答案时工作
我在这个问题中得到了例外。 当我将jetty版本更换为7.6.7.v20120910时,它起作用了
我不知道为什么它不适用于docker8.1.10.v20130312
看看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);
希望有所帮助。
正如接受的答案似乎正在做的那样,您可以使用maven-shade-plugin创建可执行的JAR文件,而不是黑客攻击WAR文件的内容。 这具有以下优点:
- 该插件包含“变换器”,用于合并META-INF /服务,LICENSE和README文件的内容。
- 您最终获得了一个JAR文件。 WAR文件的设计不是可执行的(虽然它可以工作)。
- 通过将所有依赖项解压缩到同一个JAR文件中,您将被迫删除重复的类并使内容更难以进行反向工程。
如果您不喜欢使用Jetty但是可以使用Tomcat,那么以下内容将非常有效:
org.apache.tomcat.maven tomcat7-maven-plugin 2.0 tomcat-run exec-war-only package /standalone false standalone.jar utf-8
这将创建一个名为“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
我知道(但从未尝试过)最简单的方法是winstone-maven-plugin ,就像Jenkins CI do(更好的例子:D)。 它不使用Jetty(即使我喜欢这个工具:D),但Winstone。
Maven插件用法
net.sf.alchim winstone-maven-plugin embed package
很简单,不是吗? :)它会生成一个可执行文件 – standalone – 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/