Статьи

Запускайте веб-приложения на Java во встроенных контейнерах с Maven, Jetty и Tomcat

При разработке Java-приложений очень практично иметь быструю обратную связь с «реальной» средой. В этой статье я расскажу, как запустить Java-приложение с Maven во встроенном контейнере, будь то Jetty или Tomcat. Я покажу, как я настроил их для разработки проекта podcastpedia при поддержке сайта Podcastpedia.org .

Предпосылки

У вас должен быть установлен Maven и хотя бы Java 7 . В идеале вы могли бы настроить проект podcastpedia самостоятельно, чтобы увидеть его в действии.

Jetty Maven Плагин

Конфигурация плагина

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<plugin>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-maven-plugin</artifactId>
    <version>${jetty.version}</version>
    <configuration>
        <jettyConfig>${project.basedir}/src/main/resources/config/jetty9.xml</jettyConfig>
        <stopKey>STOP</stopKey>
        <stopPort>9999</stopPort>
        <scanIntervalSeconds>5</scanIntervalSeconds>
        <scanTargets>
            <scanTarget>${project.basedir}/src/main</scanTarget>
            <scanTarget>${project.basedir}/src/test</scanTarget>
        </scanTargets>
        <contextXml>${project.basedir}/src/test/resources/jetty-context.xml</contextXml>
        <webAppConfig>
            <contextPath>/</contextPath>
        </webAppConfig>
    </configuration>
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.connector.java.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>${java.mail.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
            <version>${tomcat.jdbc.version}</version>
        </dependency>
    </dependencies>
</plugin>

Заметки:

  • jettyConfig указывает на файл конфигурации Jetty; см. следующий раздел для большего количества объяснений
  • определенные папки ( scanTargets ), где Jetty ищет изменения каждые 5 секунд ( scanInterval )
  • определены внешние зависимости для подключения к базе данных и отправки электронной почты

Конфигурационный файл Jetty.xml

Конфигурационный файл Jetty xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="UTF-8"?>
<Configure class="org.eclipse.jetty.webapp.WebAppContext">
    <New id="pcmdbDS" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg>jdbc/pcmDB</Arg>
        <Arg>
            <New class="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource">
                <Set name="Url">jdbc:mysql://localhost:3307/pcmDB?allowMultiQueries=true
                </Set>
                <Set name="User">pcm</Set>
                <Set name="Password">pcm_pw</Set>
            </New>
        </Arg>
    </New>
    <New id="mailSessionId" class="org.eclipse.jetty.plus.jndi.Resource">
        <Arg>mail/Session</Arg>
        <Arg>
            <New class="org.eclipse.jetty.jndi.factories.MailSessionReference">
                <Set name="user">[email protected]</Set>
                <Set name="password">test-dev</Set>
                <Set name="properties">
                    <New class="java.util.Properties">
                        <Put name="mail.host">mail.podcastpedia.org</Put>
                        <Put name="mail.debug">true</Put>
                        <Put name="mail.transport.protocol">smtp</Put>
                        <Put name="mail.smtp.port">25</Put>
                        <Put name="mail.smtp.auth">true</Put>
                    </New>
                </Set>
            </New>
        </Arg>
    </New>
</Configure>

В файле конфигурации Jetty (jetty.xml) настроено следующее:

  • Класс сервера (или подкласс, если он расширен) и глобальные параметры.
  • ThreadPool (минимальная и максимальная резьба).
  • Разъемы (порты, тайм-ауты, размеры буфера, протокол).
  • Структура обработчика (обработчики по умолчанию и / или contextHandlerCollections).
  • Диспетчер развертывания, который сканирует и развертывает веб-приложения и контексты.
  • Службы входа, которые обеспечивают проверку подлинности.
  • Журнал запросов.

Плагин Apache Tomcat Maven

Конфигурация плагина Apache Tomcat Maven

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<plugin>
    <groupId>org.apache.tomcat.maven</groupId>
    <artifactId>tomcat7-maven-plugin</artifactId>
    <version>2.2</version>
    <configuration>
        <!-- http port -->
        <port>8080</port>
        <!-- application path always starts with /-->
        <path>/</path>
        <!-- optional path to a context file -->
        <contextFile>context.xml</contextFile>
        <!-- optional system propoerties you want to add -->
        <systemProperties>
            <appserver.base>${project.build.directory}/appserver-base</appserver.base>
            <appserver.home>${project.build.directory}/appserver-home</appserver.home>
            <derby.system.home>${project.build.directory}/appserver-base/logs</derby.system.home>
            <java.io.tmpdir>${project.build.directory}</java.io.tmpdir>
        </systemProperties>
        <!-- if you want to use test dependencies rather than only runtime -->
        <useTestClasspath>false</useTestClasspath>
        <!-- optional if you want to add some extra directories into the classloader -->
        <additionalClasspathDirs>
            <additionalClasspathDir></additionalClasspathDir>
        </additionalClasspathDirs>
    </configuration>
    <!-- For any extra dependencies needed when running embedded Tomcat (not WAR dependencies) add them below -->
    <dependencies>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>${mysql.connector.java.version}</version>
        </dependency>
        <dependency>
            <groupId>javax.mail</groupId>
            <artifactId>mail</artifactId>
            <version>${java.mail.version}</version>
        </dependency>
        <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-jdbc</artifactId>
            <version>${tomcat.jdbc.version}</version>
        </dependency>
    </dependencies>
</plugin>

Заметки

  • указать порт, на котором работает Tomcat
  • указать contextFile, где Tomcat ищет конфигурацию
  • определены внешние зависимости для подключения к базе данных и отправки электронной почты

context.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<Context>
  <Resource
            name="jdbc/pcmDB"
            auth="Container"
            type="javax.sql.DataSource"
            factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
            initialSize="5"
            maxActive="55"
            maxIdle="21"
            minIdle="13"
            timeBetweenEvictionRunsMillis="34000"
            minEvictableIdleTimeMillis="55000"
            validationQuery="SELECT 1"
            validationInterval="34"
            testOnBorrow="true"
            removeAbandoned="true"
            removeAbandonedTimeout="233"
            username="pcm"
            password="pcm_pw"
            driverClassName="com.mysql.jdbc.Driver"
            url="jdbc:mysql://localhost:3307/pcmDB?allowMultiQueries=true"
   />
 
    <Resource name="mail/Session" auth="Container"
                type="javax.mail.Session"
                username="[email protected]"
                password="test-dev"            
                mail.smtp.host="mail.podcastpedia.org"
                mail.smtp.port="25"
                mail.smtp.user="[email protected]"
                mail.transport.protocol="smtp"
                mail.smtp.auth="true"
    />
</Context>

В context.xml определены ресурсы базы данных и электронной почты.

Вот и все… Web-приложения Java на базе Spring Framework, использующие легкие контейнеры сервлетов, представляющие собой настоящую альтернативу серверам JAVA EE и все расходы, которые с ними связаны.

Замечания:
Это простые конфигурации, но их достаточно для текущей разработки. Мой совет — прочитать соответствующую документацию для более сложных опций и возможностей.

Ресурсы

  1. Jetty Maven Плагин
  2. Плагин Apache Tomcat Maven