为什么maven在构建过程中不复制属性文件?

时间:2011-04-03 02:01:34

标签: maven java-ee-6 resourcebundle

我发现的任何东西都无法帮助我解决这个具体案例。我最近从一个普通的旧的Java Web应用程序项目(正在运行)切换到一个maven web项目。我得到以下运行时异常:

java.util.MissingResourceException: Can't find bundle for base name com.myapp.config, locale en

我正在使用Netbeans创建一个JSF 2.0,Spring和Hibernate Web应用程序。我有以下目录结构:

  

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构建插件没有复制属性文件一样。我知道你可以在pom中放置一个标签,但它对我不起作用。下面的链接提到资源文件夹(对我来说是空的)在构建期间包含其内容但是如果是这种情况,你如何从Netbeans做到这一点?我只希望将属性文件与我的war一起打包,以便在将其部署到服务器时可以访问它。

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's 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>

4 个答案:

答案 0 :(得分:36)

默认情况下,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

答案 1 :(得分:12)

您的项目的构建路径配置为在Netbeans中是什么?您可以尝试将其更改为src/main/webapp/WEB-INF/classes。这样,从src/main/java文件夹编译的类文件以及src/main/resources下的任何资源都应该包含在生成的WAR中。然后,如果将其放在src/main/resources文件夹下,则可以访问config.properties文件。

您还可以查看pom.xml中的所有includes部分,并确保不会意外排除某些内容(如果您明确包含某些内容,则可能会隐式排除其他内容)。

答案 2 :(得分:0)

尝试将config.properties放在src \ main \ resources \ com \ myapp下。我能够在本地项目上测试这个。我正在运行Maven 3.0.2。

使用webapp原型创建了一个mvn示例项目:

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来简化你的POM以查看它是否开始工作。试验和错误并不好玩,但我只是没有看到任何应该破坏它的东西。

答案 3 :(得分:0)

默认情况下,Maven将包括资源文件夹下的所有文件。如果属性文件不在资源文件夹中,则需要在build部分下的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>
相关问题