создать исполняемую банку с помощью maven и jetty

Я хочу запустить свое приложение, используя причал, поэтому я добавил зависимость, упомянутую ниже. и когда я запускаю основной метод, Jetty запускается успешно. (я работаю над проектом maven struts2 + spring3 + hibernate, я также могу развернуть его в tomcat)

Теперь я хочу создать исполняемый файл jar из файла упаковки войны. Поэтому я добавил maven-assembly-plugin в свой pom. (Я пробовал использовать плагин 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-dependencies.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 /, все файлы свойств и файлы xml находятся в / WEB-INF / lib /, и я попытался запустить войну

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

но не смог найти основной класс.

работал при создании исполняемого файла проверки войны sumit answer

Я получал исключение как в этом вопросе. когда я заменил причальную версию на 7.6.7.v20120910, она сработала

я не знаю, почему это не сработало с причалом 8.1.10.v20130312


person jos    schedule 10.12.2013    source источник
comment
Ваше исключение говорит о проблеме с applicationContext-dca.xml? Вы уверены, что /home/myfolder/workspace/app/dca/src/main/webapp/WEB-INF/web.xml - это правильное расположение web.xml для развернутой войны исполняемых файлов? Я бы подумал, что это должно быть связано с войной?   -  person Sumit    schedule 10.12.2013
comment
как указать относительный путь? предположим, что моя банка находится в /home/myfolder/app-dca-1.0.jar.   -  person jos    schedule 10.12.2013


Ответы (4)


Взгляните на 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);

надеюсь, это поможет.

person Sumit    schedule 10.12.2013
comment
не могли бы вы добавить немного теории в свой блог. и почему исполняемый jar не принимает классы в WEB-INF, создавая папку, подобную структуре для пакета, а также все зависимые jar. - person jos; 11.12.2013
comment
Когда я пробовал ваш код org.apache.jasper.JasperException: /common/taglibs.jsp(5,62) PWC6188: The absolute uri: http://java.sun.com/jsp/jstl/core cannot be resolved in either web.xml or the jar files deployed with this application at org.apache.jasper.compiler.DefaultErrorHandler.jspError(DefaultErrorHandler.java:92), я получаю следующее исключение - person jos; 11.12.2013
comment
я не знаю, почему я получаю эту ошибку из-за конфликта jar? У меня есть jstl-1.2.jar в / WEB-INF / lib / созданной войны. И есть еще одна папка, созданная / javax / servlet / jsp / jstl /, в которой есть папки core, fmt, sql, tlv. - person jos; 11.12.2013
comment
Извините, это не мой блог. Но вам могут понадобиться файлы tld в папке web-inf / tld - person Sumit; 11.12.2013

Вместо того, чтобы взламывать содержимое файла WAR, как кажется в принятом ответе, вы можете создать исполняемый файл JAR с помощью maven-shade-plugin. Это дает следующие преимущества:

  • Плагин содержит «преобразователи» для слияния содержимого файлов META-INF / services, LICENSE и README.
  • Вы получаете файл JAR. Файлы WAR не предназначены для исполнения (хотя это работает).
  • Распаковывая все зависимости в один и тот же файл JAR, вы вынуждены удалять повторяющиеся классы и затруднять обратное проектирование содержимого.
person Gili    schedule 05.05.2014
comment
Я делаю это, но не уверен, что делать в основном методе. со ссылками на военный файл он терпит неудачу, говоря, что не может найти военный файл. а файла войны нет в банке, правда. как мне получить maven shade для включения военного файла? Мне это кажется странным, но черт возьми, если это сработает. - person barclay; 09.09.2014
comment
@ kewpiedoll99, вы не используете файл WAR, точка. Сначала вам нужно выяснить, как запустить Jetty из распакованной структуры каталогов (это отдельный вопрос, который вам понадобится в Google). Как только вы получите эту работу, исчерпание исполняемого JAR будет работать. - person Gili; 10.09.2014

Если вы не привязаны к использованию 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>

В результате будет создан uberjar под названием "standalone.jar", который затем можно будет запустить, просто вызвав

java -jar standalone.jar

это запустит приложение на http://localhost:8080/standalone

Выбрать альтернативный порт очень просто

java -jar standalone.jar -httpPort=7070

Спасибо записи в блоге Томаша Нуркевича за выделение этого http://www.nurkiewicz.com/2012/11/standalone-web-application-with.html

person JedA    schedule 07.06.2015
comment
НЕА! Там написано INFO: Запуск ProtocolHandler [http-bio-8080], а localhost: 8080 вообще ничего не показывает. Также существует исключение нулевого указателя в версии 2.0. - person 3xCh1_23; 31.01.2016
comment
Просто работает для меня, но URL-адрес должен быть localhost: 8080 / standalone, поскольку путь настройки / standalone - person pdem; 02.11.2016

Самый простой способ, который я знаю (но никогда не пробовал) - это winstone-maven-plugin, как у 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

Документация

person Jean-Rémy Revy    schedule 11.12.2013
comment
Хм ... плагин Winstone Maven сейчас кажется слишком старым для последних версий Maven. Я сразу получил исключение NullPointerException, когда попробовал. - person Eric; 12.05.2016
comment
На самом деле, это довольно старый ответ относительно эволюции технологий. На данный момент я бы (и я) использую Spring-boot для таких нужд. - person Jean-Rémy Revy; 12.05.2016