web-dev-qa-db-ja.com

Mavenがビルドプロセス中にプロパティファイルをコピーしないのはなぜですか?

私が見つけたものは、この特定のケースを解決するのを助けることができませんでした。最近、普通の古い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内に配置できるタグがあることは知っていますが、うまくいきませんでした。以下のリンクは、resourcesフォルダー(私にとっては空)の内容がビルド中に含まれていることを述べていますが、その場合、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>
17
Nicholas22j

プロジェクトのビルドパスはNetbeansになるように構成されていますか? src/main/webapp/WEB-INF/classesに変更してみてください。これにより、src/main/Javaフォルダーからコンパイルしたクラスファイルと、src/main/resourcesの下にあるリソースが、生成されたWARに含まれるようになります。 src/main/resourcesフォルダーの下に配置すると、config.propertiesファイルにアクセスできるようになります。

また、pom.xmlのincludesセクションを確認し、誤って何かを除外していないことを確認することもできます(明示的に一部を含めた場合、他のすべてを暗黙的に除外している可能性があります)。

13
Dave

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 から

37
Roger Keays

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を簡素化し、機能するかどうかを確認します。試行錯誤は面白くありませんが、私はそれを破るはずの上の何かを見ていません。

0
squawknull

デフォルトでは、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>
0
Segun Emmanuel