Статьи

Создание собственного GWT Spring Maven Archetype

Привет всем,

Просматривая эту действительно интересную статью Джастина о Spring и GWT, я подумал, что было бы чрезвычайно полезно показать, как создать свой собственный архетип maven. Представленный нами архетип основан на последнем проекте Джастина и включает в себя различные технологии, такие как Spring , GWT , AspectJ , HornetQ и Infinispan .

Хватит говорить, давайте запачкаем руки.

Подготовка архетипа.

Сначала у вас должен быть шаблон проекта, который вы будете использовать для создания своего архетипа. В нашей презентации вы найдете проект Джастина здесь .

Перейдите в корневой каталог проекта и выполните следующую команду.

1
mvn archetype:create-from-project

После выполнения команды вы найдете новый проект, который создается в следующем расположении: $ {project_home} / target / generate-sources / archetype. Это полный проект архетипа maven, который вы можете настроить для своих нужд.

  • В папке src / main / resources / META-INF / maven вы найдете archetype-metadata.xml, который является дескриптором архетипа.
  • В папке src / main / resources / archetype-resources находится шаблон проекта, который будет создан.

Кастомизация архетипа.

Архетипы Maven используют скорость Apache для генерации своего кода. Вы можете получить доступ к переменным скорости в файле, установив следующие константы в верхней части файла:

1
2
3
#set( $symbol_pound = '#' )
#set( $symbol_dollar = '$' )
#set( $symbol_escape = '\' )

Затем вы получаете доступ к свойствам maven, таким как artifactId , используя этот синтаксис $ {artifactId}. Также вы можете использовать следующий синтаксис __artifactId__ для доступа к значению параметра.

Основные параметры, которые есть у каждого архетипа:

  • идентификатор_группы
  • артефакта
  • версия
  • пакет

Также вы можете установить столько переменных, сколько захотите, в archetype-metadata.xml, используя следующий синтаксис:

1
2
3
4
5
<requiredproperties _moz-userdefined="">
      <requiredproperty _moz-userdefined="" key="custom_variable">
       <defaultvalue _moz-userdefined="">default_value</defaultvalue>
      </requiredproperty>
</requiredproperties>

обратите внимание, что каждый раз, когда вы добавляете переменную, вы должны редактировать src / test / resources / projects / basic / archetype.properties и добавлять свой параметр.

1
2
3
4
version=0.1-SNAPSHOT
groupId=archetype.it
artifactId=basic
custom_variable=default_value

В нашем примере мы выполнили следующие изменения:

В src / main / resources / META-INF / maven / archetype-metadata.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
<requiredProperties>
      <requiredProperty key="db">
       <defaultValue>derby</defaultValue>
      </requiredProperty>
      <requiredProperty key="dburl">
       <defaultValue>javacodegeeks</defaultValue>
      </requiredProperty>
      <requiredProperty key="dbusername">
       <defaultValue>***</defaultValue>
      </requiredProperty>
      <requiredProperty key="dbpassword">
       <defaultValue>***</defaultValue>
      </requiredProperty>
      <requiredProperty key="cache">
       <defaultValue>y</defaultValue>
      </requiredProperty>
</requiredProperties>

В src / test / resources / projects / basic / archetype.properties

1
2
3
4
5
db=derby
dburl=javacodegeeks
dbusername=test
dbpassword=test
cache=n

В src / main / resources / archetype-resources / pom.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
#if( $db == "derby" )
    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <version>10.6.1.0</version>
    </dependency>
    #elseif( $db == "mysql" )
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.13</version>
    </dependency>
    #else  
    <dependency>
        <groupId>org.apache.derby</groupId>
        <artifactId>derby</artifactId>
        <version>10.6.1.0</version>
    </dependency>

И

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<plugin>
        <artifactId>maven-resources-plugin</artifactId>
        <version>2.4.3</version>
        <executions>
          <execution>
            <id>copy-resources</id>
            <!-- here the phase you need -->
            <phase>validate</phase>
            <goals>
              <goal>copy-resources</goal>
            </goals>
            <configuration>
              <outputDirectory>${basedir}/src/main/webapp/${package}.Application</outputDirectory>
              <resources>
                <resource>
                  <directory>${basedir}/src/main/resources/${artifactId}</directory>
                  <filtering>true</filtering>
                </resource>
              </resources>
            </configuration>
          </execution>
        </executions>
      </plugin>

В src / main / resources / archetype-resources / src / main / webapp / WEB-INF / applicationContext.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
#if($db == "mysql")
    <bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
        init-method="init" destroy-method="close">
        <property name="uniqueResourceName" value="javacodegeeks" />
        <property name="xaDataSourceClassName"
            value="com.mysql.jdbc.jdbc2.optional.MysqlXADataSource" />
        <property name="xaProperties">
            <props>
                <prop key="URL">${dburl}</prop>
                <prop key="user">${dbusername}</prop>
                <prop key="password">${dbpassword}</prop>
            </props>
        </property>
        <property name="maxPoolSize" value="50" />
        <property name="minPoolSize" value="20" />
    </bean>
    #else
    <bean id="dataSource" class="com.atomikos.jdbc.AtomikosDataSourceBean"
        init-method="init" destroy-method="close">
        <property name="uniqueResourceName" value="javacodegeeks" />
        <property name="xaDataSourceClassName" value="org.apache.derby.jdbc.EmbeddedXADataSource" />
        <property name="xaProperties">
            <props>
                <prop key="databaseName">${dburl}</prop>
                <prop key="createDatabase">create</prop>
            </props>
        </property>
        <property name="maxPoolSize" value="50" />
        <property name="minPoolSize" value="20" />
    </bean>
    #end

В src / main / resources / archetype-resources / src / main / resources / META-INF / persistence.xml

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
#if($cache == "y")
            <property name="hibernate.cache.use_second_level_cache" value="true"/>
            <property name="hibernate.cache.use_query_cache" value="true"/>
            <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>
            <!--
            <property name="hibernate.cache.infinispan.entity.eviction.strategy" value= "LRU"/>
            <property name="hibernate.cache.infinispan.entity.eviction.wake_up_interval" value= "2000"/>
            <property name="hibernate.cache.infinispan.entity.eviction.max_entries" value= "5000"/>
            <property name="hibernate.cache.infinispan.entity.expiration.lifespan" value= "60000"/>
            <property name="hibernate.cache.infinispan.entity.expiration.max_idle" value= "30000"/>
            -->
 
    #else
            <property name="hibernate.cache.use_second_level_cache" value="false"/>^M
                        <property name="hibernate.cache.use_query_cache" value="false"/>^M
 
    #end

Переименуйте com / javacodegeeks / gwtspring / public folder в __artifactId__.

Установка и запуск архетипа

Чтобы установить архетип, перейдите в корневую папку архетипа и введите .

1
mvn install

Это должно создать файл ~ / .m2 / archetype-catalog.xml, который вы можете импортировать в eclipse, если вы затмеваете пользователя m2eclipse.

Для запуска архетипа выполните следующее.

1
mvn archetype:generate -DarchetypeCatalog=local -DarchetypeGroupId=com.javacodegeeks -DarchetypeArtifactId=gwtspring-archetype

Или создайте новый проект maven в eclispe и выберите архетип из локального каталога, который вы импортировали из ~ / .m2 / archetype-catalog.xml .

*** Обратите внимание, что архетип может быть моментальным снимком, и вы должны отметить «Включить архетипы моментальных снимков» .

Исходный код архетипа доступен здесь .

Надеюсь, вам понравится эта статья,

С уважением,

похлопывание