Почему maven не копирует файлы свойств во время процесса сборки?
Ничего, что я нашел, не смог помочь мне решить этот конкретный случай. Недавно я переключился с простого старого проекта веб-приложения java (который работал) на веб-проект maven. Я получаю следующее исключение времени выполнения:
java.util.MissingResourceException: Can't find bundle for base name com.myapp.config, locale en
Я использую Netbeans для создания веб-приложения JSF 2.0, Spring и Hibernate. У меня есть следующая структура каталогов:
src\main\java\com\myapp Содержит config.properties
src\main\resources target\myapp\WEB-INF\classes\com\myapp Содержит скомпилированные файлы классов без config.properties
src\main\java\com\myapp Содержит config.properties
Проверка WAR файла в целевой папке не отображает никаких признаков файла свойств, поэтому он не должен копировать файлы свойств в Maven. Я знаю, что есть метка, которую вы можете разместить внутри помпы, но это не сработало для меня. В приведенной ниже ссылке упоминается, что папка ресурсов (пустая для меня) имеет свое содержимое, включенное во время сборки, но если это так, как вы это делаете от Netbeans? Я просто хочу, чтобы файл свойств был упакован с моей войной, поэтому он доступен, когда он развернут на сервере.
http://maven.apache.org/plugins/maven-war-plugin/examples/adding-filtering-webresources.html
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>com.myapp</groupId>
<artifactId>myapp</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>myapp</name>
<url>http://maven.apache.org</url>
<repositories>
<repository>
<id>java.net</id>
<name>Repository hosting the Java EE 6 artifacts</name>
<url>http://download.java.net/maven/2</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>javax.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>6.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-hibernate3</artifactId>
<version>2.0.8</version>
</dependency>
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.1.8</version>
</dependency>
<dependency>
<groupId>net.authorize</groupId>
<artifactId>java-anet-sdk</artifactId>
<version>1.4.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.15</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>3.8.2</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>2.1.1</version>
<configuration>
<failOnMissingWebXml>false</failOnMissingWebXml>
</configuration>
</plugin>
</plugins>
<finalName>${artifactId}</finalName>
</build>
<profiles>
<profile>
<id>endorsed</id>
<activation>
<property>
<name>sun.boot.class.path</name>
</property>
</activation>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<!-- javaee6 contains upgrades of APIs contained within the JDK itself.
As such these need to be placed on the bootclasspath, rather than classpath of the
compiler.
If you don't make use of these new updated API, you can delete the profile.
On non-SUN jdk, you will need to create a similar profile for your jdk, with the similar property as sun.boot.class.path in Sun JDK.-->
<compilerArguments>
<bootclasspath>${settings.localRepository}/javax/javaee-endorsed-api/6.0/javaee-endorsed-api-6.0.jar${path.separator}${sun.boot.class.path}</bootclasspath>
</compilerArguments>
</configuration>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-endorsed-api</artifactId>
<version>6.0</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<properties>
<netbeans.hint.deploy.server>gfv3ee6</netbeans.hint.deploy.server>
</properties>
Ответы
Ответ 1
Каков ваш путь построения проекта, настроенный на использование Netbeans? Вы можете попробовать изменить его на src/main/webapp/WEB-INF/classes
. Таким образом, файлы классов, скомпилированные из вашей папки src/main/java
, и любые ресурсы, которые у вас есть под src/main/resources
, должны быть включены в созданную WAR. Затем вы сможете получить доступ к своему файлу config.properties, если поместите его в папку src/main/resources
.
Вы также можете просмотреть все разделы includes
в вашем pom.xml и убедиться, что вы случайно не исключили что-то (если вы явно включаете некоторые вещи, вы, вероятно, неявно исключаете все остальное).
Ответ 2
Maven не копирует ресурсы из дерева исходных текстов java по умолчанию, но вы можете заставить его сделать это, добавив это в свой pom.xml:
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<excludes><exclude>**/*.java</exclude></excludes>
</resource>
</resources>
</build>
Убедитесь, что вы исключили исходные файлы java.
От http://www.ninthavenue.com.au/how-to-change-mavens-default-resource-folder
Ответ 3
Попробуйте поместить ваши config.properties в src\main\resources\com\myapp. Я смог проверить это на местном проекте. Я запускаю Maven 3.0.2.
Создал проект образца mvn с архетипом webapp:
mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp
Создал каталог в src/main/resources/com/foo и поместил в него файл foo.properties.
Выполнить сборку:
mvn clean install
Затем при поиске в конечном целевом каталоге появляется файл foo.properties:
ls -al target/my-webapp/WEB-INF/classes/com/foo/
-rw-r--r-- 1 sblaes staff 4 Apr 2 22:09 foo.properties
Вы можете попробовать эти шаги на своей машине. Если это сработает, начните пытаться упростить свой POM выше, удалив из него вещи, чтобы увидеть, начинает ли он работать. Судебное разбирательство и ошибка не являются забавой, но я просто ничего не вижу выше, что должно нарушать ее.
Ответ 4
По умолчанию maven будет включать все файлы в папке ресурсов. Если ваши файлы свойств не находятся в папке ресурсов, то вам нужно включить следующее в файл pom.xml в разделе сборки.
<build>
/* other tags like <plugins> goes here */
<sourceDirectory>src/main/java</sourceDirectory>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
/* other tags like <plugins> goes here */
</build>