Maven "не удалось разобрать сообщение об ошибке" (Java 7 + Maven 2) - PullRequest
10 голосов
/ 15 февраля 2012

У меня есть проект GWT на основе Maven, который включает в себя Guava.Я сталкиваюсь с проблемой, когда Maven пытается (и не может) скомпилировать источники, найденные в guava-gwt*.jar:

could not parse error message:   symbol:   static setCountImpl
  location: class
/home/mark/.m2/repository/com/google/guava/guava-gwt/11.0.1/guava-gwt-11.0.1.jar(com/google/common/collect/AbstractMultiset.java):100: error: cannot find symbol
    return setCountImpl(this, element, count);
           ^

Я не могу понять, почему Maven считает, что необходимо скомпилировать источники в guava-gwt.Вот как выглядит мой проект:

├── pom.xml
└── src
    ├── main
    │   └── java
    └── test
        └── java
            └── SomeTestFile.java

SomeTestFile.java

import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.Multimap;
import org.junit.Test;

public class SomeTestFile {
    @Test
    public void testMethod() {
        Multimap<Integer, String> someMap = ArrayListMultimap.create();
        someMap.put(5, "five");
        System.out.println(someMap);
    }

}

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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>guava-problem</groupId>
    <artifactId>guava-problem</artifactId>
    <version>1.0</version>

    <dependencies>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>11.0.1</version>
        </dependency>

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava-gwt</artifactId>
            <version>11.0.1</version>
        </dependency>

        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.8.2</version>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

</project>

Я уже попробовал следующее:

  • Удаление зависимости guava (оставлено только guava-gwt)
  • Scoping guava-gwt до provided

Я не уверен, что ещепытаться.guava-gwt включает источники, потому что GWT скомпилирует его в эквивалентный Javascript.Но я не хочу, чтобы Maven пытался скомпилировать эти источники.

Редактировать

Только примечание ... сами тестовые файлы не нуждаются в guava-gwt сверх guava, так какони скомпилированы и выполняются как код Java (они не проходят этап компиляции GWT).Мне не нужно guava-gwt специально для этих тестов, но оно должно быть доступно для моего действительного кода клиента GWT.

Полный вывод Maven

mark@mark-peters:~/devel/guava-problem$ mvn -V clean test-compile
Apache Maven 2.2.1 (rdebian-1)
Java version: 1.7.0
Java home: /usr/lib/jvm/jdk1.7.0/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux" version: "2.6.32-38-generic" arch: "amd64" Family: "unix"
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - guava-problem:guava-problem:jar:1.0
[INFO]    task-segment: [clean, test-compile]
[INFO] ------------------------------------------------------------------------
[INFO] [clean:clean {execution: default-clean}]
[INFO] Deleting file set: /home/mark/devel/guava-problem/target (included: [**], excluded: [])
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/mark/devel/guava-problem/src/main/resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Nothing to compile - all classes are up to date
[INFO] [resources:testResources {execution: default-testResources}]
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/mark/devel/guava-problem/src/test/resources
[INFO] [compiler:testCompile {execution: default-testCompile}]
[INFO] Compiling 1 source file to /home/mark/devel/guava-problem/target/test-classes
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure

/home/mark/.m2/repository/com/google/guava/guava-gwt/11.0.1/guava-gwt-11.0.1.jar(com/google/common/collect/AbstractMultiset.java):[19,0] error: cannot find symbol

could not parse error message:   symbol:   static setCountImpl
  location: class
/home/mark/.m2/repository/com/google/guava/guava-gwt/11.0.1/guava-gwt-11.0.1.jar(com/google/common/collect/AbstractMultiset.java):100: error: cannot find symbol
    return setCountImpl(this, element, count);
           ^

could not parse error message:   symbol:   method setCountImpl(AbstractMultiset<E>,E,int)
  location: class AbstractMultiset<E>
  where E is a type-variable:
    E extends Object declared in class AbstractMultiset
/home/mark/.m2/repository/com/google/guava/guava-gwt/11.0.1/guava-gwt-11.0.1.jar(com/google/common/collect/AbstractMultiset.java):105: error: cannot find symbol
    return setCountImpl(this, element, oldCount, newCount);
           ^


[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 2 seconds
[INFO] Finished at: Tue Feb 21 12:49:42 EST 2012
[INFO] Final Memory: 18M/212M
[INFO] ------------------------------------------------------------------------

Редактировать (снова)

Обнаружив, что источник проблемы не имеет ничего общего с Гуавой, а скорее с версией Maven (см. мой ответ ), я обновил заголовок и вопрос, чтобы попытаться быть намного более полезнымдля будущих пользователей.

Ответы [ 5 ]

22 голосов
/ 21 февраля 2012

tl; dr

Maven 2 и JDK 7 несовместимы, так как Maven пытается проанализировать вывод javac, который изменился в JDK 7.

Полное объяснение

Примечание Рагурамато, что это сработало для него в Maven 3+, привело меня к дальнейшему изучению этой проблемы не как проблемы конфигурации, а как реальной проблемы Maven.Я начал проводить дополнительное тестирование и обнаружил, что эта проблема:

  • Происходит с Java 7 и Maven 2.2.1
  • Не возникает с Java 7 и Maven 3 +
  • Не происходит с Java 6 и Maven 2.2.1

Так что в этот момент мне стало ясно, что ошибки «не удалось разобрать сообщение об ошибке» были актуальны, ипроблема, вероятно, была связана не с компиляцией guava-gwt 1020 *, происходящей , а с Maven, который не знал, как правильно обрабатывать ошибки.

Чтобы проверить это, я создал отдельный проект Maven, который не имеет ничего общего с Guava:

├── pom.xml
└── src
    └── main
        └── java
            └── ClassWithWarnings.java

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/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>maven-problem</groupId>
    <artifactId>maven-problem</artifactId>
    <version>1.0</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

ClassWithWarnings.java

public class ClassWithWarnings implements java.io.Serializable {}

И вот, танки Maven также используются в этом проекте при использовании Java 7:

mark@mark-peters:~/devel/maven-problem$ mvn -V compile
Apache Maven 2.2.1 (rdebian-1)
Java version: 1.7.0
Java home: /usr/lib/jvm/jdk1.7.0/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux" version: "2.6.32-38-generic" arch: "amd64" Family: "unix"
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - maven-problem:maven-problem:jar:1.0
[INFO]    task-segment: [compile]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/mark/devel/maven-problem/src/main/resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 1 source file to /home/mark/devel/maven-problem/target/classes
[INFO] ------------------------------------------------------------------------
[ERROR] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Compilation failure
could not parse error message: warning: [options] bootstrap class path not set in conjunction with -source 1.3
/home/mark/devel/maven-problem/src/main/java/ClassWithWarnings.java:1: warning: [serial] serializable class ClassWithWarnings has no definition of serialVersionUID
public class ClassWithWarnings implements java.io.Serializable {}
       ^


[INFO] ------------------------------------------------------------------------
[INFO] For more information, run Maven with the -e switch
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Tue Feb 21 13:10:47 EST 2012
[INFO] Final Memory: 14M/150M
[INFO] ------------------------------------------------------------------------

В Java 6 он по-прежнему выдает предупреждения, но может анализировать вывод Javac и поэтому не'tank:

Apache Maven 2.2.1 (rdebian-1)
Java version: 1.6.0_20
Java home: /usr/lib/jvm/java-6-openjdk/jre
Default locale: en_US, platform encoding: UTF-8
OS name: "linux" version: "2.6.32-38-generic" arch: "amd64" Family: "unix"
[INFO] Scanning for projects...
[INFO] ------------------------------------------------------------------------
[INFO] Building Unnamed - maven-problem:maven-problem:jar:1.0
[INFO]    task-segment: [compile]
[INFO] ------------------------------------------------------------------------
[INFO] [resources:resources {execution: default-resources}]
[WARNING] Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent!
[INFO] skip non existing resourceDirectory /home/mark/devel/maven-problem/src/main/resources
[INFO] [compiler:compile {execution: default-compile}]
[INFO] Compiling 1 source file to /home/mark/devel/maven-problem/target/classes
[WARNING] /home/mark/devel/maven-problem/src/main/java/ClassWithWarnings.java:[1,7] [serial] serializable class ClassWithWarnings has no definition of serialVersionUID

[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ------------------------------------------------------------------------
[INFO] Total time: < 1 second
[INFO] Finished at: Tue Feb 21 13:18:39 EST 2012
[INFO] Final Memory: 9M/150M
[INFO] ------------------------------------------------------------------------

Так что, похоже, проблема в том, что последняя версия Maven 2 не знает, как анализировать сообщения об ошибках из Java 7+ javac.Maven 3 делает.Я до сих пор не нашел документацию по этому вопросу и немного удивлен, что Maven не выдает предупреждение, когда пытается компилировать версию JDK, что он не знает, как правильно поддерживать.

2 голосов
/ 24 октября 2012

Случилось с нами, что мы получили точно такой же отказ, но с gradle вместо maven. После переключения с ArrayListMultimap на LinkedListMultimap ошибка исчезла. Похоже, что в версии 11.0.2, по крайней мере, ArrayListMultimap не работает.

2 голосов
/ 20 июля 2012

Для аналогичной проблемы я обновил maven-compiler-plugin до более поздней версии.

2 голосов
/ 21 февраля 2012

Преобразование моего комментария в ответ ...

Точный pom-файл вместе с тестовым классом выше прекрасно компилируется на моей Windows-коробке с maven 3.0.4.

Возможно, проблема в версии maven, которую вы используете. Или в самом помпе могут быть другие цели, которые могут стать причиной проблемы.

1 голос
/ 20 февраля 2012

Похоже, что он не пытается скомпилировать библиотеки Guava, но без полного журнала сборки maven мы не можем сказать.

Судя по информации, которую вы опубликовали до настоящего времени, вместо этого может показаться, что во время компиляции у вас есть две несовместимые версии класса или библиотеки в вашем пути к классам.

Я собираюсь попробовать ваш тестовый проект и посмотреть, смогу ли я дать вам больше информации.

EDIT:

Итак, я нашел пару интересных вещей. Во-первых, я смог заставить ваш проект работать без лишней помпы :(

Я сменил ваш помп на:

    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava</artifactId>
        <version>11.0.1</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>com.google.guava</groupId>
        <artifactId>guava-gwt</artifactId>
        <version>11.0.1</version>
        <scope>runtime</scope>
    </dependency>
    <dependency>
        <groupId>junit</groupId>
        <artifactId>junit</artifactId>
        <version>4.8.2</version>
        <scope>test</scope>
    </dependency>

По умолчанию ваш тестовый файл не запускается. Я реорганизовал его так, что теперь он называется SomeTestFileTest, который фактически запустит тест.

Я использую Maven v2.2.1 на OSX. Я также очистил свой ~ / .m2 / репозиторий перед запуском. Я предлагаю вам попробовать то же самое: уничтожить локальную папку репозитория и повторить сборку. Если это не сработает, дайте мне знать, какую версию maven вы используете.

...