web-dev-qa-db-fra.com

Query DSL & Maven: Les classes ne sont pas générées, mais uniquement en ligne de commande (cela fonctionne bien dans Eclipse)

Nous utilisons une configuration avec Spring Boot, Hibernate, Query DSL et Maven avec Java 1.8

Récemment, j'ai ajouté Query DSL au projet avec la configuration indiquée ci-dessous. Pour que cela fonctionne, je devais configurer le compilateur Java dans les paramètres du projet Eclipse afin de permettre le traitement des annotations et également ajouter le fichier Query DSL .jar au chemin Eclipse Annotation Factory.

Cette configuration a fonctionné comme prévu. Il générait les classes personnalisées Q et je pouvais les utiliser dans mon code. Lorsque vous exécutez maintenant le mvn clean install sur la ligne de commande, chaque classe de mon code génère l'erreur cannot find symbol, car la classe est manquante. Dois-je configurer quelque chose d'autre - semblable au fichier .jar dans les paramètres Eclipse - pour que le processus de construction fonctionne?

EDIT: Cette question n'est pas une copie de cette question parce que je n'ai pas demandé pourquoi cette erreur (impossible de trouver un symbole) se produit, mais plutôt comment configurer QueryDSL pour qu'il fonctionne également en ligne de commande.

EDIT2: J'ai maintenant essayé d'intégrer le build-helper-maven-plugin pour utiliser plusieurs chemins sources en entrée. Cela n'a pas aidé non plus. J'ai également essayé de générer les fichiers dans un dossier src. Cela n'a pas aidé non plus.

Lorsque je compile pour la première fois la bibliothèque dans Eclipse, le mvn compile passe sur la ligne de commande, mais mvn clean compile échoue toujours car il utilise simplement à nouveau les fichiers compilés d'Eclipse. Le plugin apt-maven est exécuté, ce qui peut être vu juste avant l'échec du processus de construction:

[INFO] --- apt-maven-plugin:1.1.3:process (default) @ project1 ---
[INFO]
[INFO] --- build-helper-maven-plugin:1.9.1:add-source (add-source) @ project1 ---
[INFO] Source directory: C:\Users\user1\git\project1\src\main\generated added.
[INFO]
[INFO] --- maven-processor-plugin:2.2.4:process (process) @ project1 ---
[ERROR] diagnostic: [...]

EDIT3: Lorsque je supprime chaque instruction import faisant référence aux classes Q, le processus de construction est exécuté (évidemment). Il est toutefois remarquable que les classes Q soient correctement compilées dans ce cas. Ils apparaissent dans le dossier target en tant que fichiers .class comme ils le devraient. Se pourrait-il que les classes Q soient compilées trop tard?


Voici un extrait du pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<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>

    [...]
    <prerequisites>
        <maven>3.0.0</maven>
    </prerequisites>

    <dependencies>
        [...]
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-apt</artifactId>
            <version>4.1.3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.querydsl</groupId>
            <artifactId>querydsl-jpa</artifactId>
            <version>4.1.3</version>
        </dependency>
    </dependencies>

    <build>
        <defaultGoal>spring-boot:run</defaultGoal>
        <plugins>
            [...]
            <plugin>
                <groupId>com.mysema.maven</groupId>
                <artifactId>apt-maven-plugin</artifactId>
                <version>1.1.3</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>process</goal>
                        </goals>
                        <configuration>
                            <outputDirectory>target/generated-sources/Java</outputDirectory>
                            <processor>com.querydsl.apt.jpa.JPAAnnotationProcessor</processor>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
        [...]
    </build>
</project>

Voici la configuration des paramètres du projet Eclipse:

 enter image description here

Ceci est le message d'erreur affiché dans la console:

[INFO] --- maven-processor-plugin:2.2.4:process (process) @ project1 ---
[ERROR] diagnostic: C:\Users\user1\git\project1\src\main\Java\com\project1\repository\UserRepositoryImpl.Java:3: error: cannot find symbol
import static com.project1.domain.QUser.user;
                                     ^
  symbol:   class QUser
  location: package com.project1.domain

[ERROR] diagnostic: C:\Users\user1\git\project1\src\main\Java\com\project1\repository\UserRepositoryImpl.Java:3: error: static import only from classes and interfaces
import static com.project.domain.QUser.user;
^
7
ssc-hrep3

C'est une vieille question, mais voici comment trouver ma solution, a ajouté le classificateur pour la dépendance jpa

    <!-- BEGIN: 'querydsl-jpa' -->
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>${querydsl-jpa.version}</version>
        <classifier>apt</classifier>
    </dependency>
    <!-- END: 'querydsl-jpa' -->

Mon pom complet:

<!-- BEGIN: BUILD -->
<build>

    <!-- BEGIN: PLUGINS -->
    <plugins>

        <!-- BEGIN: apt-maven-plugin -->
        <plugin>
            <groupId>com.mysema.maven</groupId>
            <artifactId>apt-maven-plugin</artifactId>
            <version>${apt.version}</version>
            <executions>
                <execution>
                    <goals>
                        <goal>process</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>target/generated-sources/apt</outputDirectory>
                        <processor>com.mysema.query.apt.jpa.JPAAnnotationProcessor</processor>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <!-- END: apt-maven-plugin -->

    </plugins>
    <!-- END: PLUGINS -->

</build>
<!-- END: BUILD -->

<!-- BEGIN: DEPENDENCIES -->
<dependencies>

    <!-- *********************************************** -->
    <!-- BEGIN: 'QUERYDSL DEPENDENCIES'                  -->

    <!-- BEGIN: 'querydsl-apt' -->
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-apt</artifactId>
        <version>${querydsl-apt.version}</version>
    </dependency>
    <!-- END: 'querydsl-apt' -->

    <!-- BEGIN: 'querydsl-jpa' -->
    <dependency>
        <groupId>com.mysema.querydsl</groupId>
        <artifactId>querydsl-jpa</artifactId>
        <version>${querydsl-jpa.version}</version>
        <classifier>apt</classifier>
    </dependency>
    <!-- END: 'querydsl-jpa' -->

    <!-- *********************************************** -->
    <!-- END: 'QUERYDSL DEPENDENCIES'                    -->


</dependencies>
2
cmlonder

Je préférerais utiliser profile pour générer ces Qclasses uniquement lorsque la modification de la base de données se produit.

les inconvénients: 

-votre différentiel dans les demandes d'extraction est propre lorsque vous ne modifiez pas le schéma de base de données, car pour chaque génération, ces fichiers ont tendance à générer différemment pour une raison quelconque (du moins dans mon cas).

-vous pouvez gérer les tables présentes dans votre base de données auront des classes Q (parfois, il est pénible d’oublier de les régénérer après avoir changé le schéma de base de données)

-bien pas que c'est beaucoup de temps. mais les constructions sont plus rapides si vous ne modifiez pas le schéma et que le profil est désactivé.

Essayez quelque chose comme ceci et activez le profil quand vous voulez générer un Qclasses de schéma modifié:

<properties>
    <whitelisted.tables>
        user_accunt,
        other
    </whitelisted.tables>
</properties>
<profiles>
    <profile>
        <id>generate</id>
        <build>
            <plugins>
                <plugin>
                    <groupId>com.querydsl</groupId>
                    <artifactId>querydsl-maven-plugin</artifactId>
                    <version>${querydsl.version}</version>
                    <executions>
                        <execution>
                            <goals>
                                <goal>export</goal>
                            </goals>
                        </execution>
                    </executions>
                    <configuration>
                        <jdbcDriver>org.postgresql.Driver</jdbcDriver>
                        <jdbcUrl>jdbc:postgresql://localhost:port/dbname</jdbcUrl>
                        <packageName>your.package.name.for.q</packageName>
                        <jdbcUser>dbusername</jdbcUser>
                        <jdbcPassword>dbpassword</jdbcPassword>
                        <targetFolder>${project.basedir}/src/main/Java/</targetFolder>
                        <spatial>true</spatial>
                        <tableNamePattern>${whitelisted.tables}</tableNamePattern>
                    </configuration>
                    <dependencies>
                        <dependency>
                            <groupId>org.postgresql</groupId>
                            <artifactId>postgresql</artifactId>
                            <version>42.1.1</version>
                        </dependency>
                    </dependencies>
                </plugin>
            </plugins>
        </build>
    </profile>
</profiles>
1
Szychan

Par convention, Maven suppose que tout le code source se trouve dans 'src/main/Java', le compile et place tous les fichiers * .class dans la cible.

Donc si vous avez une classe 'Alien.Java' dans <project-root>/alice/in/wonderland, vous ne pourrez pas y accéder (dans src/main/Java) car maven place tout le contenu de src/main/Java dans classpath pour votre compilateur et par conséquent le compilateur ignore tout code source * .Java) n'importe où ailleurs.

Dans votre cas, vous générez votre code source dans le répertoire target/generated-sources/Java, vous devrez donc en informer Maven. Comme mentionné dans d'autres réponses, vous pouvez utiliser build-helper-plugin à cet effet, indiquez à maven que votre source réside sur target/generated-sources/Java par 

 <project>
  ...
  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>build-helper-maven-plugin</artifactId>
        <version>3.0.0</version>
        <executions>
          <execution>
            <id>add-source</id>
            <phase>generate-sources</phase>
            <goals>
              <goal>add-source</goal>
            </goals>
            <configuration>
              <sources>
                <source>target/generated-sources/Java</source>
                <source>alice/in/wonderland</source>
              </sources>
            </configuration>
          </execution>
        </executions>
      </plugin>
    </plugins>
  </build>
</project>

Edit: Vous avez mentionné le mauvais chemin dans build-helper-plugin

Je vois bien que vous utilisez le plugin d'aide à la construction, mais que vous utilisez un mauvais chemin

 --- build-helper-maven-plugin:1.9.1:add-source (add-source) @ project1 ---
[INFO] Source directory: C:\Users\user1\git\project1\src\main\generated added.

Au lieu de src\main\generated, vous devriez utiliser <source>target/generated-sources/Java</source>

0
old-monk

Vous pouvez essayer quelques choses:

1.try pour mettre <clearOutputDir>false</clearOutputDir> dans votre balise configuration
2. Parfois, les classes peuvent ne pas être générées avant la phase de compilation. Alors essayez de mettre en phase dans votre plugin

   <execution>
        <phase>generate-sources</phase>
        <goals>
            <goal>...</goal>
        </goals>
    </execution>


0
Vivek Shukla

Le répertoire source généré n'est pas automatiquement inclus dans le fichier jar.

Vous devez utiliser le plug-in d'aide à la génération Maven pour résoudre ce problème, par exemple:

https://github.com/alexec/javahelp-skeleton/blob/master/pom.xml

0