Java 使用maven和jetty创建可执行jar

Java 使用maven和jetty创建可执行jar,java,spring,maven,executable-jar,embedded-jetty,winstone-maven-plugin,Java,Spring,Maven,Executable Jar,Embedded Jetty,Winstone Maven Plugin,我想使用jetty启动我的应用程序,因此我添加了下面提到的依赖项。当我运行主方法时,Jetty成功启动。(我正在从事struts2+spring3+HibernateMaven项目,我也能够在tomcat中部署它) 现在我想从war打包pom创建一个可执行jar。因此,我在pom中添加了maven汇编插件。(我尝试使用maven jar插件,但它没有添加依赖项) 来源 插件 我得到了一个例外。当我将jetty版本替换为7.6.7.v20120910时,它工作正常 我不知道为什么jetty 8

我想使用jetty启动我的应用程序,因此我添加了下面提到的依赖项。当我运行主方法时,Jetty成功启动。(我正在从事struts2+spring3+HibernateMaven项目,我也能够在tomcat中部署它)

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

来源 插件


我得到了一个例外。当我将jetty版本替换为7.6.7.v20120910时,它工作正常

我不知道为什么jetty 8.1.10.v20130312不起作用看看

有关守则如下:

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

我所知道的(但从未尝试过的)最简单的方法是,像Jenkins CI那样(一个更好的例子:D)。 它不使用Jetty(即使我喜欢这个工具:D),而是Winstone

Maven插件使用

net.sf.alchim

  • Winstone Maven插件:
  • 一个完整的例子:

  • 您可以使用创建一个可执行的JAR文件,而不是像所做的那样对WAR文件的内容进行黑客攻击。这有以下优点:

    • 该插件包含用于合并META-INF/services、许可证和自述文件内容的“转换器”
    • 最终会得到一个JAR文件。WAR文件不是设计为可执行的(尽管它可以工作)
    • 通过将所有依赖项解压到同一个JAR文件中,您将被迫删除重复的类,并使内容更难进行反向工程

    如果您不想使用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>
    
    这将在上启动应用程序

    选择备用端口很容易

    java -jar standalone.jar -httpPort=7070
    

    多亏了Tomasz Nurkiewicz的博客文章强调了这一点

    ,你的例外是说applicationContext-dca.xml有问题吗?您确定/home/myfolder/workspace/app/dca/src/main/webapp/WEB-INF/WEB.xml是部署的可执行war的正确WEB.xml位置吗?我认为它必须与战争有关?如何给出相对路径?假设我的jar在/home/myfolder/app-dca-1.0.jar中,你能在你的博客中添加一些理论吗。为什么可执行jar不在WEB-INF中使用类而不是为包创建类似文件夹的结构,所有依赖的jar也是如此PWC6188:绝对uri:http://java.sun.com/jsp/jstl/core 无法在web.xml或在org.apache.jasper.compiler.DefaultErrorHandler.jsperor(DefaultErrorHandler.java:92)上部署此应用程序的jar文件中解析。
    我不知道为什么会出现此错误是因为jar冲突吗?我在创建的war的/WEB-INF/lib/中有jstl-1.2.jar,还有另一个创建的/javax/servlet/jsp/jstl/文件夹,它在itSorry中有core、fmt、sql、tlv文件夹,这不是我的博客。但是您可能需要web inf/tld文件夹中的tld文件。我正在这样做,但不确定在main方法中要做什么。由于引用了war文件,它失败了,说它找不到war文件。而且war文件不在罐子里,struth。如何让maven shade包含war文件?这对我来说似乎不可靠,但如果它有效的话,@kewpiedoll99,你不使用战争文件,句号。首先,您需要弄清楚如何在一个未打包的目录结构中运行Jetty(这是一个单独的问题,您需要在Google上搜索)。一旦你开始工作,用完一个可执行的JAR就可以了。不!上面写着“INFO:Starting ProtocolHandler[“http-bio-8080”]”,localhost:8080则什么也没有显示。版本2.0中也有一个空指针异常仅适用于我,但url必须是空的,因为配置路径是/standaloneHm。。。Winstone Maven插件对于现在最新版本的Maven来说似乎太旧了。当我尝试它的时候,我立刻得到了一个空点异常。事实上,这个关于技术进化的答案是非常古老的。至于现在,我会(而且我确实会)使用SpringBoot来满足这种需求。
    java -jar standalone.jar -httpPort=7070