web-dev-qa-db-ja.com

DSLとMavenのクエリ:クラスは生成されませんが、コマンドラインでのみ生成されます(Eclipseでは正常に機能しています)

Spring Boot、Hibernate、Query DSL、MavenのセットアップをJava 1.8

最近、以下の構成でQueryDSLをプロジェクトに追加しました。これを機能させるには、Eclipseプロジェクト設定でJavaコンパイラーを構成して、注釈処理を許可し、Query DSL .jarファイルをEclipse注釈ファクトリパスに追加する必要がありました。

この設定は期待どおりに機能しました。カスタムのQクラスが生成され、コードで使用できました。コマンドラインでmvn clean installを実行すると、クラスが欠落しているため、コード内のすべてのクラスでエラーcannot find symbolがスローされます。ビルドプロセスを機能させるために、Eclipse設定の.jarファイルと同様に構成する必要があるものは他にありますか?

編集:この質問は この質問 の重複ではありません。理由を尋ねなかったためです(記号が見つかりません)発生しますが、コマンドラインでも機能するようにQueryDSLを構成する方法です。

EDIT2:build-helper-maven-pluginを統合して、複数のソースパスを入力として使用しようとしました。これも役に立ちませんでした。また、ファイルをsrcフォルダーに生成しようとしました。それも役に立たなかった。

Eclipseでライブラリを最初にコンパイルすると、コマンドラインでmvn compileが実行されますが、Eclipseのコンパイル済みファイルを再度使用するため、mvn clean compileは失敗します。 apt-maven-pluginが実行されます。これは、ビルドプロセスが失敗する直前に確認できます。

[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:Qクラスを参照しているすべてのインポートステートメントを削除すると、ビルドプロセスが(明らかに)実行されます。ただし、その場合、Qクラスが正しくコンパイルされることは注目に値します。それらは、targetフォルダーに.classファイルとして表示されます。 Qクラスのコンパイルが遅すぎる可能性がありますか?


ここに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>

これはEclipseプロジェクト設定の構成です:

enter image description here

これはコンソールに表示されるエラーメッセージです:

[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

これは古い質問ですが、これが私の解決策を見つける方法であり、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' -->

私の完全なpom:

<!-- 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

むしろ、dbの変更が発生した場合にのみ、プロファイルを使用してこれらのQclassを生成したいと思います。

短所:

-dbスキーマを変更しない場合、プルリクエストの差分はクリーンです。世代ごとに、これらのファイルは何らかの理由で(少なくとも私の場合は)異なる方法で生成される傾向があるためです。

-データベースに存在するテーブルの魔女を管理することができますQclassesがあります(dbスキーマを変更した後にそれらを再生成するのを忘れると苦痛になることがあります)

-それは多くの時間であるというわけではありません。ただし、スキーマを変更せず、プロファイルがオフになっていると、ビルドが高速になります。

変更されたスキーマQclassを生成する場合は、次のような方法を試してプロファイルをオンにしてください。

<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

慣例により、Mavenはすべてのソースコードが「src/main/Java」にあると想定し、これをコンパイルしてすべての* .classファイルをターゲットに配置します。

したがって、Alien.Javaにクラス '<project-root>/alice/in/wonderland'がある場合、mavenはsrc/main/Javaからのすべてをクラスパスに配置するため、(src/main/Javaで)そのクラスにアクセスできません。コンパイラー、したがってコンパイラーは、他の場所のソースコード(* .Java)を認識しません。

あなたの場合、あなたはディレクトリtarget/generated-sources/Javaにソースコードを生成しているので、それについてmavenに伝える必要があります。他のいくつかの回答で述べたように、これにはbuild-helper-pluginを使用できます。ソースがtarget/generated-sources/JavaにあることをMavenに知らせてください。

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

編集:build-helper-pluginで間違ったパスについて言及しました

ビルドヘルパープラグインを使用しているのに、間違ったパスを使用しているのはわかります

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

src\main\generatedの代わりに<source>target/generated-sources/Java</source>を使用する必要があります

0
old-monk

あなたはいくつかのことを試すことができます:

1。入れてみてください<clearOutputDir>false</clearOutputDir>configurationタグ内
2。コンパイルフェーズの前にクラスが生成されない場合があります。だからあなたのプラグインにフェーズを入れてみてください

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


0
Vivek Shukla

生成されたソースディレクトリは、jarに自動的に含まれません。

この問題を修正するには、Mavenビルドヘルパープラグインを使用する必要があります。次に例を示します。

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

0