Maven терпит неудачу в java 10 [duplicate]

Все объекты гарантированно имеют метод .equals(), поскольку Object содержит метод, .equals(), который возвращает логическое значение. Задача подкласса переопределять этот метод, если требуется дополнительное определение определения. Без него (т. Е. С помощью ==) только адреса памяти проверяются между двумя объектами для равенства. String переопределяет этот метод .equals() и вместо использования адреса памяти возвращает сравнение строк на уровне символа для равенства.

Ключевое замечание состоит в том, что строки хранятся в одном пуле, поэтому после создания строки он всегда хранится в программе по тому же адресу. Строки не меняются, они неизменяемы. Вот почему это плохая идея использовать регулярную конкатенацию строк, если у вас есть серьезное количество обработки строк. Вместо этого вы будете использовать предоставленные классы StringBuilder. Помните, что указатели на эту строку могут измениться, и если вам было интересно увидеть, были ли два указателя одинаковыми ==, это был бы прекрасный способ. Строки сами не делают.

9
задан Peter Major 23 October 2017 в 05:41
поделиться

4 ответа

5
ответ дан Jason 29 October 2018 в 06:54
поделиться

Добавьте следующий фрагмент в свой pom.xml:

<build>
    <plugins>
        <plugin>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>9</source>
                <target>9</target>
            </configuration>
        </plugin>
    </plugins>
</build>
-3
ответ дан Jobanpreet Singh 16 August 2018 в 00:36
поделиться
  • 1
    Это уже упоминалось в вопросе, если вы читаете его полностью. – nullpointer 1 November 2017 в 17:21

Часть трассировки стека

at jdk.compiler/com.sun.tools.javac.main.JavaCompiler.readSourceFile(JavaCompiler.java:821)

относится к строке кода

throw new CompletionFailure(c, diags.fragment("cant.resolve.modules"));

Это может произойти, если вы пытаетесь построить модуль maven, который не основан на Java9 и / или не имеет (правильного) объявления модуля module-info.java с версией выпуска, указанной как 9, где он не сможет разрешать модули с / без объявления.

3
ответ дан nullpointer 16 August 2018 в 00:36
поделиться
  • 1
    Должен ли я определять module-info.java с целевой версией 9? Причина, по которой я запутался, заключается в том, что несколько других модулей Maven скомпилированы только с целевой версией 9 и без module-info.java (тогда просто удачи?). – Peter Major 23 October 2017 в 05:45
  • 2
    @PeterMajor Хорошо, что модуль под вопросом, кажется, построен с использованием объявления модуля java 9, вероятно, и это может быть некорректное объявление. Я боюсь, вам, возможно, понадобится поделиться соответствующим или воспроизводимым кодом, чтобы он мог копаться дальше. – nullpointer 23 October 2017 в 05:56
  • 3
    В одном случае я знаю, что исправлено, но еще не выпущено: github.com/codehaus-plexus/plexus-languages/issues/2 Это означает, что в дескрипторе модуля нет root, но под /META-INF/versions/9. – Robert Scholte 23 October 2017 в 17:28
  • 4
    @RobertScholte Я предполагаю, что вы хотите указать явную запись module-info.class в META-INF? – nullpointer 23 October 2017 в 17:32
  • 5
    @nullpointer, выпущенный plexus-java, принимает только дескриптор модуля в корневом баночке. JEP-238 говорит, что это не требуется, вы также можете поместить его в версии / X-папку многопользовательской банки. – Robert Scholte 23 October 2017 в 18:33

UPDATE

В большинстве случаев эта ошибка возникает, когда компилятор пытается сообщить об ошибке компиляции, но он взрывается в процессе. До сих пор в основном два подхода помогли решить эти проблемы:

  • Отключить обработку аннотаций с помощью аргумента компилятора -proc:none (похоже, что обработка аннотаций может нарушить компилятор, поэтому, если вы не предназначены для использовать любой, это бесплатный выигрыш).
  • Отладить компилятор с помощью условной точки останова и пройти стек до получения сообщения об ошибке компилятора, а затем исправить эту ошибку ...

ORGINAL SOLUTION

После множества проб и ошибок я смог локально решить проблему / исправить эту проблему, в конце концов, мой подход был следующим:

  • У меня было предположение, что, возможно, зависимости каким-то образом влияют на результат сборки, поэтому я начал комментировать записи Maven & lt; dependency> в POM отказавшего модуля.
  • сборка затем начала сбой, но он сделал это с ожидаемым, не может найти символ и подобные ошибки компиляции вместо бесполезного сбоя AssertionError
  • , оказалось, что существует один конкретный зависимостей, вызвавших этот AssertionError.
  • После анализа кода я не мог определить, какая из веских причин, почему эта зависимость вызывает проблемы, поэтому я начал смотреть на транзитивные зависимости
  • I, затем использовал тот же подход, что и раньше, но вместо того, чтобы раскомментировать ошибочную зависимость, я вложил все свои транзитивные зависимости в POM
  • , сборка снова не удалась, и после многих и многих тестов оказалось, что Я мог бы вызвать AssertionError, когда и io.vavr: vavr: 0.9.0: compile и javax.servlet: servlet-api: 3.0.1: тест был включен в граф зависимостей

It по-прежнему не соответствует мне, как зависимость от тестовой области может повлиять на компиляцию проекта ... Также выяснилось, что javax.servlet: servlet-api: 3.0.1: предоставляется уже среди зависимостей модуля сбоя, а зависимость от тестируемой области фактически не использовалась ни для чего.

В итоге я просто удалил неправильно определенный тестовый сервлет et-api из модуля запуска ошибок, и вдруг Maven смог скомпилировать ранее провальный модуль.

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

0
ответ дан Peter Major 16 August 2018 в 00:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: