Привет всем,
Просматривая эту действительно интересную статью Джастина о 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-SNAPSHOTgroupId=archetype.itartifactId=basiccustom_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> |
|
1
2
3
4
5
|
db=derbydburl=javacodegeeksdbusername=testdbpassword=testcache=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 .
*** Обратите внимание, что архетип может быть моментальным снимком, и вы должны отметить «Включить архетипы моментальных снимков» .
Исходный код архетипа доступен здесь .
Надеюсь, вам понравится эта статья,
С уважением,
похлопывание