Query DSL & Maven: классы не генерируются, а только в командной строке (в eclipse он работает нормально) - PullRequest
0 голосов
/ 30 мая 2018

Мы используем установку с Spring Boot, Hibernate, Query DSL и Maven с Java 1.8

Недавно я добавил Query DSL в проект с конфигурацией, указанной ниже.Чтобы заставить его работать, мне пришлось настроить компилятор Java в настройках проекта eclipse, чтобы разрешить обработку аннотаций, а также добавить файл Query DSL .jar в путь фабрики аннотаций eclipse.

Эта установка работала, как и ожидалось.Он генерировал пользовательские классы Q, и я мог использовать их в своем коде.При выполнении mvn clean install в командной строке каждый класс в моем коде выдает ошибку cannot find symbol, потому что класс отсутствует.Есть ли что-то еще, что мне нужно настроить - подобно файлу .jar в настройках затмения - чтобы заставить процесс сборки работать?

РЕДАКТИРОВАТЬ: Этот вопрос не является дубликатом этот вопрос потому что я не спрашивал, почему возникает эта ошибка (не удается найти символ), а как настроить QueryDSL для работы в командной строке.

EDIT2: Теперь я попытался интегрировать build-helper-maven-plugin, чтобы использовать несколько исходных путей в качестве входных данных.Это тоже не помогло.Я также попытался сгенерировать файлы в папку src.Это тоже не помогло.

Когда я впервые компилирую библиотеку в eclipse, mvn compile проходит через командную строку, но mvn clean compile все равно не работает, потому что он просто снова использует скомпилированные файлы eclipse.Выполняется 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;
^

Ответы [ 5 ]

0 голосов
/ 30 августа 2018

Это старый вопрос, но вот как я могу найти свое решение, добавил классификатор для зависимости 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>
0 голосов
/ 08 июня 2018

По соглашению Maven предполагает, что весь исходный код находится в 'src / main / java', компилирует это и помещает весь файл * .class в target.

Так что если у вас есть класс 'Alien.java' в<project-root>/alice/in/wonderland, вы не сможете получить к нему доступ (в src / main / java), потому что maven помещает все из src/main/java в classpath для вашего компилятора и, следовательно, компилятор не знает ни о каком исходном коде (* .java) где-либо еще.

В вашем случае вы генерируете свой исходный код в каталоге target/generated-sources/java, поэтому вам придется сообщить об этом maven.Как уже упоминалось в некоторых других ответах, вы можете использовать для этого build-helper-plugin. Сообщите maven, что ваш источник находится на target/generated-sources/java по

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

Редактировать: вы указали неверный путь в сборке-helper-plugin

Я вижу, что вы используете плагин build helper, но вы используете неверный путь

 --- 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 голосов
/ 06 июня 2018

Сгенерированный исходный каталог не включается автоматически в jar.

Вам нужно использовать вспомогательный плагин сборки Maven, чтобы исправить эту проблему, например:

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

0 голосов
/ 07 июня 2018

Вы можете попробовать несколько вещей:1.пробовать поставить <clearOutputDir>false</clearOutputDir> в тег configuration2. Иногда классы могут не генерироваться до фазы компиляции.Поэтому постарайтесь добавить фазу в ваш плагин

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

0 голосов
/ 01 июня 2018

Я бы предпочел использовать профиль для генерации этих Q-классов только тогда, когда происходит изменение дБ.

cons:

- ваш diff в запросах на получение данных чист, когда вы не меняете схему db, потому что дляКаждое поколение эти файлы по какой-то причине имеют тенденцию генерировать по-разному (по крайней мере, в моем случае).

- у вас есть возможность управлять таблицами, присутствующими в вашей базе данных, будут иметь Q-классы (иногда это боль, когда вы забываете восстанавливать ихпосле изменения схемы БД)

- ну не то чтобы много времени.но сборки выполняются быстрее, если вы не измените схему, а профиль отключен.

Попробуйте что-то подобное и включите профиль, если вы хотите сгенерировать измененную схему. Классы Q:: 1011 *

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