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プロジェクト設定の構成です:
これはコンソールに表示されるエラーメッセージです:
[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;
^
これは古い質問ですが、これが私の解決策を見つける方法であり、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>
むしろ、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>
慣例により、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>
を使用する必要があります
あなたはいくつかのことを試すことができます:
1。入れてみてください<clearOutputDir>false</clearOutputDir>
configuration
タグ内
2。コンパイルフェーズの前にクラスが生成されない場合があります。だからあなたのプラグインにフェーズを入れてみてください
<execution>
<phase>generate-sources</phase>
<goals>
<goal>...</goal>
</goals>
</execution>
生成されたソースディレクトリは、jarに自動的に含まれません。
この問題を修正するには、Mavenビルドヘルパープラグインを使用する必要があります。次に例を示します。
https://github.com/alexec/javahelp-skeleton/blob/master/pom.xml