18

我发现的任何东西都无法帮助我解决这一具体案例。我最近从一个普通的旧 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 Empty

target\myapp\WEB-INF\classes\com\myapp 包含编译后的类文件,没有 config.properties
src\main\java\com\myapp 包含配置属性

检查目标文件夹中的 WAR 文件不会显示任何属性文件的迹象,因此就好像 Maven 构建插件没有复制属性文件一样。我知道你可以在 pom 中放置一个标签,但它对我不起作用。下面的链接提到资源文件夹(对我来说是空的)在构建过程中包含其内容,但如果是这种情况,您如何从 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'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

5 回答 5

39

默认情况下,Maven 不会从 java 源代码树中复制资源,但您可以通过将其添加到您的 pom.xml 中来做到这一点:

<build>
  <resources>
    <resource>
      <directory>src/main/java</directory>
      <excludes><exclude>**/*.java</exclude></excludes>
    </resource>
  </resources>
</build>

确保排除 java 源文件。

来自https://rogerkeays.com/how-to-change-mavens-default-resource-folder

于 2012-08-30T19:57:18.137 回答
14

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

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

于 2011-04-03T02:37:46.527 回答
1

默认情况下,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>
于 2019-06-18T15:39:47.570 回答
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,看看它是否开始工作。反复试验并不有趣,但我只是没有看到任何超出它的东西。

于 2011-04-03T02:07:02.393 回答
0

巨大的陷阱:

  • 当您的资源位于“测试/资源”中时(例如用于测试的 .properties 文件)
  • maven 不会将它们复制到目标,因此它们不在类路径中

检查您的“包装”是否在 pom.xml 中设置为“pom”:

<packaging>pom</packaging>

解决方法是:
将您的包装改为“jar”或“war”

于 2022-01-11T11:34:40.807 回答