web-dev-qa-db-fra.com

Pourquoi maven ne copie-t-il pas les fichiers de propriétés pendant le processus de construction?

Rien de ce que j'ai trouvé n'a été capable de m'aider à résoudre ce cas particulier. Je suis récemment passé d’un ancien projet d’application Web Java (qui fonctionnait) à un projet Web maven. J'obtiens l'exception d'exécution suivante:

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

J'utilise Netbeans pour créer une application Web JSF 2.0, Spring et Hibernate. J'ai la structure de répertoire suivante:

src\main\Java\com\myapp Contient config.properties
src\main\resources Vide

target\myapp\WEB-INF\classes\com\myapp Contient les fichiers de classe compilés sans config.properties
src\main\Java\com\myapp Contient config.properties

L'inspection du fichier WAR dans le dossier cible ne montre aucun signe du fichier de propriétés, c'est donc comme si le plug-in de construction Maven ne copiait pas les fichiers de propriétés. Je sais qu'il y a une étiquette que vous pouvez placer à l'intérieur du pom mais cela n'a pas fonctionné pour moi. Le lien ci-dessous indique que le dossier de ressources (vide pour moi) a son contenu inclus lors de la construction, mais si c'est le cas, comment procédez-vous à partir de Netbeans? Je veux juste que le fichier de propriétés soit empaqueté avec mon war afin qu'il soit accessible lorsqu'il est déployé sur le serveur.

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>
16
Nicholas22j

Quel est le chemin de génération de votre projet configuré pour être dans Netbeans? Vous pouvez essayer de le changer en src/main/webapp/WEB-INF/classes. De cette façon, les fichiers de classe compilés à partir de votre dossier src/main/Java et de toutes les ressources que vous avez sous src/main/resources devraient être inclus dans le fichier WAR généré. Vous pourrez alors accéder à votre fichier config.properties si vous le placez dans le dossier src/main/resources.

Vous pouvez également consulter les sections includes de votre pom.xml et vous assurer que vous n'excluez pas accidentellement quelque chose (si vous incluez explicitement certaines choses, vous excluez probablement implicitement tout le reste).

12
Dave

Maven ne copie pas les ressources de l'arborescence source Java par défaut, mais vous pouvez le faire en ajoutant ceci à votre pom.xml:

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

Assurez-vous d'exclure les fichiers source Java.

De http://www.ninthavenue.com.au/how-to-change-mavens-default-resource-folder

36
Roger Keays

Essayez de placer votre config.properties sous src\main\resources\com\myapp. J'ai pu tester cela sur un projet local. J'exécute Maven 3.0.2.

Création d'un exemple de projet mvn avec l'archétype de l'application Web:

mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-webapp -DarchetypeArtifactId=maven-archetype-webapp

Création d'un répertoire dans src/main/resources/com/foo et insertion d'un fichier foo.properties.

A couru une construction:

mvn clean install

Ensuite, lorsque vous regardez dans le répertoire cible résultant, le fichier foo.properties apparaît:

ls -al target/my-webapp/WEB-INF/classes/com/foo/
-rw-r--r--  1 sblaes  staff    4 Apr  2 22:09 foo.properties

Vous pouvez essayer ces étapes sur votre ordinateur. Si cela fonctionne, essayez de simplifier votre POM ci-dessus en supprimant des éléments pour voir s'il commence à fonctionner. Les essais et les erreurs ne sont pas amusants, mais je ne vois rien au-dessus qui devrait le casser.

0
squawknull