Создать простое приложение с доступными для пользователя конфигурационными файлами, используя Maven - PullRequest
4 голосов
/ 23 февраля 2012

Мне нужно создать простое приложение для моего клиента, настроить и запустить его на своем сайте.Я использую среду Spring, поэтому у меня есть несколько файлов конфигурации, которые должны быть в пути к классам.Я использую Maven2 с Netbeans в качестве своей IDE.

Я могу создавать и запускать свое приложение с помощью Netbeans / Maven, и я использую плагин Application Assembler Maven для создания работающего приложения.Все это прекрасно работает, за исключением того, что мои конфигурационные файлы Spring должны быть помещены в src / main / resources , что означает, что они упакованы в получившийся файл JAR.

Мне нужно, чтобы мой клиент былв состоянии изменить файлы конфигурации, чтобы выполнить их тестирование, но нецелесообразно просить их изменить копии, упакованные в JAR.

Возможно, существует ряд решений, но мне кажется, чтопроще всего было бы заставить Maven вообще не упаковать приложение и файлы конфигурации в JAR, просто оставив их в каталоге, подобном каталогу classes , из которого они могут быть запущены.Это позволит пользователю легко изменять файлы конфигурации.К сожалению, я не могу понять, как заставить Maven «упаковать» приложение таким образом, или как заставить AppAssembler сгенерировать итоговый исполняемый файл.

Вот выдержка из моего pom.xml, которая можетпомогите проиллюстрировать, что я пытаюсь сделать:

...
  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>3.1.0.RELEASE</version>
    </dependency>
    ... stuff deleted ...
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>appassembler-maven-plugin</artifactId>
        <version>1.2</version>
        <configuration>
          <!-- Set the target configuration directory to be used in the bin scripts -->
          <configurationDirectory>conf</configurationDirectory>
          <!-- Copy the contents from "/src/main/config" to the target
               configuration directory in the assembled application -->
          <copyConfigurationDirectory>true</copyConfigurationDirectory>
          <!-- Include the target configuration directory in the beginning of
               the classpath declaration in the bin scripts -->
          <includeConfigurationDirectoryInClasspath>
              true
          </includeConfigurationDirectoryInClasspath>
          <platforms>
            <platform>windows</platform>
          </platforms>
        <programs>
          <program>
            <mainClass>org.my.path.App</mainClass>
            <name>app</name>
          </program>
        </programs>
        </configuration>
      </plugin>
    </plugins>
  </build>
...

Ответы [ 2 ]

6 голосов
/ 23 февраля 2012

Ни один упакованный JAR-файл, ни несколько распакованных файлов классов не являются хорошим форматом для профессиональной доставки клиентов. Посмотрите на эти блестящие приложения Apache, такие как tomcat, ant и maven, они поставляются в виде tar.gz или zip-файлов, после загрузки просто распакуйте их, и вы получите красивую и чистую структуру каталогов:

conf -> поместить конфигурационный файл как * .properties, logback.xml здесь
doc -> readme.txt, userguide.doc и т. д.
lib -> поместите здесь core.jar с файлом jar зависимостей
run.bat -> скрипт запуска для Windows
run.sh -> скрипт запуска для Unix

Мы можем делать такие вещи и с Maven. Обратите внимание, что вы должны спроектировать и реализовать свой основной jar-файл для правильного чтения * .properties из каталога conf затем используйте пакет приложения maven-assembly-plugin, который вы используете, в эту классическую структуру каталогов.

Пример pom.xml для приложения командной строки:

  <!-- Pack executable jar, dependencies and other resource into tar.gz -->
  <plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-assembly-plugin</artifactId>
    <version>2.2-beta-5</version>
    <executions>
      <execution>
        <phase>package</phase>
        <goals><goal>attached</goal></goals>
      </execution>
    </executions>
    <configuration>
      <descriptors>
        <descriptor>src/main/assembly/binary-deployment.xml</descriptor>
      </descriptors>
    </configuration>
  </plugin>

Пример двоичного-deploy.xml для приложения командной строки:

<!--
  release package directory structure:
    *.tar.gz
      conf
        *.xml
        *.properties
      lib
        application jar
        third party jar dependencies
      run.sh
      run.bat
-->
<assembly>
  <id>bin</id>
  <formats>
    <format>tar.gz</format>
  </formats>
  <includeBaseDirectory>true</includeBaseDirectory>
  <fileSets>
    <fileSet>
      <directory>src/main/java</directory>
      <outputDirectory>conf</outputDirectory>
      <includes>
        <include>*.xml</include>
        <include>*.properties</include>
      </includes>
    </fileSet>
    <fileSet>
      <directory>src/main/bin</directory>
      <outputDirectory></outputDirectory>
      <filtered>true</filtered>
      <fileMode>755</fileMode>
    </fileSet>
    <fileSet>
      <directory>src/main/doc</directory>
      <outputDirectory>doc</outputDirectory>
      <filtered>true</filtered>
    </fileSet>
  </fileSets>
  <dependencySets>
    <dependencySet>
      <outputDirectory>lib</outputDirectory>
      <useProjectArtifact>true</useProjectArtifact>
      <unpack>false</unpack>
      <scope>runtime</scope>
    </dependencySet>
  </dependencySets>
</assembly>
4 голосов
/ 11 сентября 2013

Если не вводить в заблуждение, я думаю, что вы хотите, чтобы jar и config были разделены, чтобы jar был открыт для тестирования клиента.Следующее может сделать это для вас с помощью copy-maven-plugin, оно может выполнять почти задачи, которые будет делать сборка-плагин, например: копирование, зависимость и многое другое - загрузка, загрузка, перемещение, ....

        <plugin>
            <groupId>com.github.goldin</groupId>
            <artifactId>copy-maven-plugin</artifactId>
            <version>0.2.5</version>
            <executions>
                <execution>
                    <id>create-archive</id>
                    <phase>package</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <resources>
                    <!--copy your scripts to ${myOutPutPath}/bin-->
                    <resource>
                        <targetPath>${myOutPutPath}/bin</targetPath>
                        <directory>${project.basedir}/src/main/scripts</directory>
                        <includes>
                            <include>*</include>
                        </includes>
                    </resource>
                    <resource>
                        <!--copy your configs-->
                        <targetPath>${myOutPutPath}/conf</targetPath>
                        <directory>${project.basedir}/src/main/config</directory>
                        <include>*</include>
                    </resource>
                </resources>
            </configuration>
        </plugin>

Упакуйте основной jar-файл и поместите в ваш $ {myOutPutPath}

        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>2.3.1</version>
            <!-- The configuration of the plugin -->
            <configuration>
                <outputDirectory>${myOutPutPath}</outputDirectory>
                <!-- Configuration of the archiver -->
                <archive>
                    <!-- Manifest specific configuration -->
                    <manifest>
                        <!-- Classpath is added to the manifest of the created jar file. -->
                        <addClasspath>true</addClasspath>
                        <!--
                           Configures the classpath prefix. This configuration option is
                           used to specify that all needed libraries are found under lib/
                           directory.
                       -->
                        <classpathPrefix>lib/</classpathPrefix>
                        <!-- Specifies the main class of the application -->
                        <mainClass>com.xinguard.snmp.SNMP_ETL</mainClass>
                    </manifest>
                    <!-- you need to add some classpath by yourself, like conf here for client to use-->
                    <manifestEntries>
                        <Class-Path>conf/</Class-Path>
                    </manifestEntries>
                </archive>
            </configuration>
        </plugin>

, затем упакуйте lib jar в каталог lib в каталоге jar.

       <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <executions>
                <execution>
                    <id>copy-dependencies</id>
                    <phase>prepare-package</phase>
                    <goals>
                        <goal>copy-dependencies</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${myOutPutPath}/lib</outputDirectory>
                    </configuration>
                </execution>
            </executions>
        </plugin>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...