Статьи

AppFuse, уменьшенный

(В ноябре у меня было некоторое время между клиентами. Чтобы занять свое время, я немного тренировал свое тело и мозг. Я тратил пару часов в день на упражнения и несколько часов в день на  AppFuse . AppFuse не используется для начинать проекты почти так же, как это было раньше. Это имеет смысл, поскольку в JVM было множество инноваций, и сейчас есть множество  быстро  начинающих фреймворков. Среди моих любимых — Spring Boot, JHipster, Grails и Play.

Вы можете видеть, что активность сообщества AppFuse значительно снизилась за эти годы, если вы посмотрите трафик его списка рассылки.

Трафик списка рассылки AppFuse, декабрь 2014

Несмотря на то, что в списке рассылки не так много пользователей, кажется, что его все равно загружают из Maven Central.

AppFuse Maven Central Stats, ноябрь 2014

Я думаю, что самое большое значение, которое AppFuse предоставляет сейчас, — это инструмент обучения для тех, кто над ним работает. Кроме того, это хорошее место, чтобы показать другим разработчикам, как они могут развиваться с открытыми средами (например, Spring, Hibernate, JSF, Tapestry, Struts) в течение нескольких лет. Например, может быть полезно показать, как мы перешли на Spring MVC Test. Предстоящий переход на Spring Data вместо нашего общего решения DAO также может быть интересным.

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

  1. Изменен родительский элемент AppFuse, чтобы он был основан на платформе  Spring IO . Этот проект является менеджером зависимостей, который определяет номера версий для проектов с открытым исходным кодом, которые хорошо работают с Spring.
  2. Определены плагины, их версии и конфигурации в  <pluginManagement>.
  3. Определены зависимости, их версии и исключения в  <dependencyManagement>.
  4. Упрощенные архетипы, поэтому новые проекты имеют минимальные зависимости. Например, вот основной проект  pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
 
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.company</groupId>
    <artifactId>springmvc-project</artifactId>
    <packaging>war</packaging>
    <version>1.0-SNAPSHOT</version>
    <name>AppFuse Spring MVC Application</name>
 
    <parent>
        <groupId>org.appfuse</groupId>
        <artifactId>appfuse-web</artifactId>
        <version>3.5.0-SNAPSHOT</version>
    </parent>
 
    <build>
        <plugins>
            <plugin>
                <groupId>de.juplo</groupId>
                <artifactId>hibernate4-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>dbunit-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>build-helper-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
 
    <dependencies>
        <dependency>
            <groupId>org.appfuse</groupId>
            <artifactId>appfuse-${web.framework}</artifactId>
            <version>${appfuse.version}</version>
            <type>pom</type>
        </dependency>
    </dependencies>
 
    <properties>
        <amp.genericCore>true</amp.genericCore>
        <amp.fullSource>false</amp.fullSource>
        <dao.framework>hibernate</dao.framework>
        <db.name>mydatabase</db.name>
        <web.framework>spring</web.framework>
 
        <!-- Framework/Plugin versions -->
        <appfuse.version>3.5.0-SNAPSHOT</appfuse.version>
        <java.version>1.7</java.version>
    </properties>
 
    <profiles>
        <profile>
            <id>itest</id>
            <build>
                <plugins>
                    <plugin>
                        <groupId>org.codehaus.cargo</groupId>
                        <artifactId>cargo-maven2-plugin</artifactId>
                    </plugin>
                    <plugin>
                        <groupId>org.codehaus.mojo</groupId>
                        <artifactId>webtest-maven-plugin</artifactId>
                    </plugin>
                </plugins>
            </build>
        </profile>
    </profiles>
 
    <reporting>
        <plugins>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>webtest-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </reporting>
</project>

Запрос на получение этих изменений говорит сам за себя:

Правильно, я смог удалить хороший кусок кода, не затрагивая функциональность AppFuse 1 . Я думаю, что мы все можем согласиться с тем, что меньше кода == проще в обслуживании. Эта тема будет продолжена, пока мы работаем над будущими выпусками.

Другие улучшения включают миграцию всех тестов для использования JUnit4, интеграцию Spring MVC Test и настройку подключаемого модуля surefire для параллельного запуска тестов. I Кроме того,  плагин build-helper-maven-plugin  теперь используется для поиска открытых портов для запуска Cargo, и было проведено большое количество тестов, чтобы убедиться, что вы можете создавать / тестировать несколько проектов, полученных из AppFuse, одновременно. Наконец, я перешел на  hibernate4-maven-plugin  и обновился до Tapestry 5.4.

В следующей версии AppFuse я планирую удалить как можно больше XML — перенести всю конфигурацию в JavaConfig Spring. Мы также перейдем на Java 8 как минимум. Я даже рассматриваю возможность избавления от всех файлов pom.xml в пользу другого языка сборки, который требует меньше кода.

Другими словами, следующий выпуск 3.5 будет последним выпуском, который поддерживает Java 7 и использует XML Spring для конфигурации. AppFuse 4.0 будет стремиться к #NoXML. Дорожная карта проекта  содержит более подробную информацию о дополнительных надеждах и мечтах.

Мы будем рады услышать ваши отзывы об этих изменениях. Вам нравится тема упрощения? Вы согласны с тем, что AppFuse является родителем в ваших проектах?

1. Для статистики проекта и кода, смотрите  AppFuse на Open Hub .