Maven2 копирует ресурсы в каталог сборки, но НЕ связывает их в JAR - PullRequest
8 голосов
/ 26 октября 2010

Я запустил новый проект Maven в NetBeans, принимая все значения по умолчанию. POM, со всеми вычеркнутыми зависимостями JAR, вставлен в конец этого вопроса.

Приложение считывает различные файлы свойств (например, ведение журнала и конфигурация). Он также читает внешние ресурсы, такие как шрифты, изображения и звуки. Я НЕ хочу, чтобы все эти ресурсы были объединены в файл JAR. Вместо этого я планирую развернуть их в подкаталогах под каталогом, в котором развернут JAR.

Упрощенный вид структуры каталогов проекта выглядит следующим образом:

-src
   |---main
           |---java
                   |---com.mypackage, etc
           |---resources
                        |---conf
                        |---fonts
                        |---images
                        |---sounds
+target

То, что я бы хотел бы получить после чистой сборки, выглядело бы так:

+src
-target
       |---myproject-1.0.0.jar (compiled contents of "src/main/java" ONLY)
       |---conf
       |---fonts
       |---images
       |---sounds

Тем не менее, когда я выполняю «чистую сборку» или «exec» через NetBeans (или в этом отношении из командной строки) ... то, что я на самом деле получаю, выглядит это:

+src
-target
       |---classes
                  |---("src/main/java" and "src/main/resources" slammed together)
       |---myproject-1.0.0.jar (the "classes" subdirectory JAR'ed up)

Может ли кто-нибудь указать мне правильное направление для получения первого результата, а не второго? Я прошу прощения, если это глупый вопрос (я новичок Maven), или если я пропустил ранее заданный дубликат. Тем не менее, по результатам поиска в переполнении стека ... похоже, что все повторяющиеся вопросы пытаются пойти по другому пути! (т.е. получить ресурсы в JAR, а не хранить их out )

pom.xml:

<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>steveperkins</groupId>
    <artifactId>myproject</artifactId>
    <packaging>jar</packaging>
    <version>1.0.0</version>
    <name>My Project</name>
    <url>http://maven.apache.org</url>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.0.2</version>
                <configuration>
                    <source>1.4</source>
                    <target>1.4</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
    <dependencies>
    ...

Ответы [ 4 ]

11 голосов
/ 26 октября 2010

Хотя предложенные решения будут работать, они в основном работают вокруг конвенций maven.Лучшей альтернативой было бы отфильтровать ресурсы, чтобы они не включались в jar, но оставались доступными как ресурсы при работе в IDE.В помпе это должно выглядеть так:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <executions>
                <execution>
                    <goals>
                        <goal>jar</goal>
                    </goals>
                    <configuration>
                        <excludes>
                            <exclude>/conf/**</exclude>
                            <exclude>/fonts/**</exclude>
                            <exclude>/images/**</exclude>
                            <exclude>/sounds/**</exclude>
                        </excludes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
   </plugins>
</build>

Это фактически исключит их из банки без каких-либо обходных путей.

Здесь - страница документа для банкиПлагин.

Хотя вышеизложенное ответит на ваш вопрос, могу я предложить дополнительную возможность, которая может помочь вам в вашей работе.В качестве второго шага, чтобы сделать эти ресурсы доступными, вы можете упаковать свой проект с помощью плагина assembly .это позволит вам создать zip-файл и поместить все файлы, ресурсы и jar в подходящее место, чтобы при распаковке zip-архивов все просто становилось на свои места.

Если этот проект является частью более крупногоДля работы вы все равно можете использовать плагин сборки для каждой ситуации, в которой у вас есть такая ситуация, и в основном проекте вы можете извлечь и собрать их в более крупном zip-архиве, включающем все необходимые артефакты.структура под целью как есть.Если вы настраиваете его, было бы предпочтительно сделать это через переменные Maven, чтобы изменения распространялись на другие плагины.Если вы вручную удалите и переименуете материал после прохождения Maven, у вас могут возникнуть проблемы позже.Обычно плагин Maven jar должен быть в состоянии сделать все правильно, если вы настроите его так, как вы хотите, чтобы вам не нужно было беспокоиться о том, что попадает под цель.Лично я использую Eclipse, и pusign довольно хорошо синхронизирует конфигурацию IDE и Maven.Я подозреваю, что для NetBeans это также имеет место.Если нет, лучше всего настроить ваш проект в NetBeans для использования target / classes в качестве целевой папки для встроенных артефактов и target / test-classes для материала, созданного из src / test / java.

6 голосов
/ 26 октября 2010

Лично я бы не использовал расположение ресурсов по умолчанию, а "дополнительное" местоположение и настраивал плагин ресурсов для копирования их туда, куда вы хотите:

<project>
  ...
  <build>
    <plugins>
      <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}/target</outputDirectory>
              <resources>          
                <resource>
                  <directory>src/non-packaged-resources</directory>
                  <filtering>true</filtering>
                </resource>
              </resources>              
            </configuration>            
          </execution>
        </executions>
      </plugin>
    </plugins>
    ...
  </build>
  ...
</project>

Если вы настаиваете на использовании значения по умолчаниюlocation (src/main/resources), я думаю, вам придется настроить некоторые исключения (см. ниже), чтобы избежать копирования ресурсов по умолчанию, а затем использовать тот же подход, что и выше.

Другой вариант - использоватьПлагин AntRun maven и Ant для перемещения файлов, но это не совсем maven, поэтому я не буду его подробно описывать.

Ресурсы

0 голосов
/ 26 октября 2010

Евгений на правильном пути, но есть лучший способ сделать эту работу.

Это должно выглядеть примерно так:

<build>
  <outputDirectory>target/${artifactId}-${version}</outputDirectory>
  <plugins>
    <plugin>
      <groupId>org.apache.maven.plugins</groupId>
      <artifactId>maven-jar-plugin</artifactId>
      <version>2.3.1</version>
      <configuration>
        <classesDirectory>${project.build.outputDirectory}</classesDirectory>
        <outputDirector>target</outputDirectory>
      </configuration>
    </plugin>
  </plugins>
  <resources>
    <resource>
      <directory>src/main/resources/conf</directory>
      <targetPath>../conf</targetPath>
    </resource>
    <resource>
      <directory>src/main/resources/ANOTHER_PATH</directory>
      <targetPath>../ANOTHER_PATH</targetPath>
    </resource>
  </resources>
</build>

Вы не сможете избавиться от каталога 'classes', но вы сможете дать ему другое имяэто не должно мешать работе NetBeans.

Подробнее об элементе <outputDirectory> можно узнать здесь .

Подробнее о плагине jar можно узнать здесь..

Подробнее об элементе <resource> можно найти здесь .

. В качестве примечания, вы можете рассмотреть возможность запуска Maven под 1.6 JDK.и разветвите maven-compiler-plugin, чтобы использовать ваш 1.4 JDK для компиляции.Вы можете узнать больше об этом здесь .Это должно дать вам повышение времени компиляции.Вы также можете сказать безошибочно при запуске тестовых случаев использовать также 1.4 JDK для выполнения.

0 голосов
/ 26 октября 2010

Вы можете настроить специальное выполнение ресурсов: copy-resources goal.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...