HTML-модуль скелетного проекта PlayN не может найти основной модуль в maven?

На основе вики-страницы "Начало работы" PlayN я создал скелет проекта (называемый GuiPoc). в затмении. Мне удалось успешно скомпилировать проект guipoc-html (с Google -> GWT Compile) и, наконец, Run as -> Web Application. Я попытался использовать mvn gae:run из каталога guipoc/html (в cygwin) согласно вики и получил следующий результат:

[INFO]
[INFO] ------------------------------------------------------------------------
[INFO] Building GuiPoc HTML 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] >>> maven-gae-plugin:0.9.2:run (default-cli) @ guipoc-html >>>
[WARNING] The POM for com.mydomain.mynamespace:guipoc-core:jar:0.0.1-SNAPSHOT is missing, no dependency information available
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 0.619s
[INFO] Finished at: Sun Jan 01 20:05:29 VET 2012
[INFO] Final Memory: 8M/121M
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal on project guipoc-html: Could not resolve dependencies for project com.mydomain.mynamespace:guipoc-html:war:0.0.1-SNAPSHOT: Failure to find com.mydomain.mynamespace:guipoc-core:jar:0.0.1-SNAPSHOT in http://forplay.googlecode.com/svn/mavenrepo was cached in the local repository, resolution will not be reattempted until the update interval of forplay-legacy has elapsed or updates are forced -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/DependencyResolutionException

Актуальный вопрос: я не понимаю, почему он ищет зависимость в системном репозитории, а не в локальном каталоге. Что я делаю неправильно? Нужно ли мне что-то менять в моих файлах pom.xml? Создать settings.xml в моем каталоге C:\Users\MyName.m2 и что-то там установить?

Вот содержимое guipoc/html/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>
  <parent>
    <groupId>com.mydomain.mynamespace</groupId>
    <artifactId>guipoc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>

  <artifactId>guipoc-html</artifactId>
  <packaging>war</packaging>
  <name>GuiPoc HTML</name>

  <properties>
    <gwt.module>com.mydomain.mynamespace.GuiPoc</gwt.module>
    <gwt.name>guipoc</gwt.name>
    <!-- Desired Google App Engine SDK version -->
    <gae.version>1.6.0</gae.version>
  </properties>

  <dependencies>
    <dependency>
      <groupId>com.mydomain.mynamespace</groupId>
      <artifactId>guipoc-core</artifactId>
      <version>${project.version}</version>
    </dependency>

    <dependency>
      <groupId>com.googlecode.playn</groupId>
      <artifactId>playn-html</artifactId>
      <version>${playn.version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.codehaus.mojo</groupId>
        <artifactId>gwt-maven-plugin</artifactId>
      </plugin>
      <plugin>
        <artifactId>maven-eclipse-plugin</artifactId>
        <version>2.8</version>
        <configuration>
          <downloadSources>true</downloadSources>
          <downloadJavadocs>false</downloadJavadocs>
          <wtpversion>2.0</wtpversion>
          <additionalBuildcommands>
            <buildCommand>
              <name>com.google.gwt.eclipse.core.gwtProjectValidator</name>
            </buildCommand>
          </additionalBuildcommands>
          <additionalProjectnatures>
            <projectnature>com.google.gwt.eclipse.core.gwtNature</projectnature>
            <projectnature>com.google.appengine.eclipse.core.gaeNature</projectnature>
          </additionalProjectnatures>
        </configuration>
      </plugin>
      <plugin>
        <groupId>net.kindleit</groupId>
        <artifactId>maven-gae-plugin</artifactId>
        <version>0.9.2</version>
        <dependencies>
          <!--
            Declare explicit dependency on gae-runtime here,
            so we can specify the App Engine SDK version
          -->
          <dependency>
            <groupId>net.kindleit</groupId>
            <artifactId>gae-runtime</artifactId>
            <version>${gae.version}</version>
            <type>pom</type>
          </dependency>
        </dependencies>
      </plugin>
    </plugins>
  </build>
</project>

Вот содержимое guipoc/core/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>
  <parent>
    <groupId>com.mydomain.mynamespace</groupId>
    <artifactId>guipoc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>

  <artifactId>guipoc-core</artifactId>
  <packaging>jar</packaging>
  <name>GuiPoc Core</name>

  <dependencies>
    <dependency>
      <groupId>com.googlecode.playn</groupId>
      <artifactId>playn-core</artifactId>
      <version>${playn.version}</version>
    </dependency>
  </dependencies>

  <build>
    <plugins>
      <plugin>
        <groupId>org.apache.maven.plugins</groupId>
        <artifactId>maven-source-plugin</artifactId>
      </plugin>
    </plugins>

    <resources>
      <!-- include the source files in our main jar for use by GWT -->
      <resource>
        <directory>${project.build.sourceDirectory}</directory>
      </resource>
      <!-- and continue to include our standard resources -->
      <resource>
        <directory>${basedir}/src/main/resources</directory>
      </resource>
    </resources>
  </build>
</project>

Вот содержимое guipoc/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>
  <parent>
    <groupId>com.googlecode.playn</groupId>
    <artifactId>playn-project</artifactId>
    <version>1.0.3</version>
  </parent>

  <groupId>com.mydomain.mynamespace</groupId>
  <artifactId>guipoc</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  <name>GuiPoc Metaproject</name>

  <properties>
    <playn.version>1.0.3</playn.version>
  </properties>

  <modules>
    <module>core</module>
    <module>java</module>
    <module>html</module>
    <module>android</module>
  </modules>
  <dependencies>
    <dependency>
        <groupId>com.sun</groupId>
        <artifactId>tools</artifactId>
        <version>1.6</version>
        <scope>system</scope>
        <systemPath>C:\Program Files\Java\jdk1.7.0_02\lib\tools.jar</systemPath>
    </dependency>
  </dependencies>
</project>

person Mark Schmit    schedule 02.01.2012    source источник


Ответы (1)


К сожалению, Maven не слишком умен в многомодульных проектах. Стандартный проект PlayN (включая ваш) имеет следующую модульную структуру:

top
+- core
+- html (depends on core)
+- java (depends on core)
+- android, flash, etc.

Когда вы находитесь в каталоге top и вызываете Maven, он считывает все POM подмодулей и «знает» обо всех них и правильно настраивает пути к классам, чтобы они видели соответствующий каталог classes при компиляции и запуске.

Но если вы зайдете, скажем, в каталог html и вызовете там Maven, он больше не «знает» обо всех подмодулях. Все, о чем он знает, это html POM, и когда он видит зависимость для чего-либо еще (например, модуль core в данном случае), он проходит через стандартный процесс разрешения зависимостей, а именно:

  1. Проверьте локальный репозиторий Maven ~/.m2/repository.
  2. Проверьте репозитории, явно указанные в POM.
  3. Проверьте Maven Central.

Когда у вас есть ситуация, когда вы хотите запустить команду в одном из ваших проектов подмодулей, вы должны сделать это из проекта верхнего уровня. Вот почему тестирование из командной строки включает запуск mvn test -P test-java или mvn test -P test-html из каталога верхнего уровня, а не просто переход в каталог java или html и запуск mvn test.

К сожалению, приемы, которые мы используем для проверки подмодуля Java или HTML из командной строки, не работают с gae:run. Таким образом, в этом случае вам нужно обойти ограничения Maven, сначала установив артефакты вашего проекта в локальный репозиторий Maven, прежде чем вызывать gae:run (и действительно, делая это каждый раз, когда вы хотите протестировать использование gae:run. Это достигается следующим образом:

cd top
mvn install
cd html
mvn gae:run

Было бы здорово, если бы Maven был достаточно умен, чтобы обнаруживать, что он запускается в каталоге подмодуля, и автоматически разрешать родственные зависимости так же, как если бы вы вызывали Maven из каталога проекта верхнего уровня. Увы, умный — это прилагательное, которое редко применимо к Maven.

person samskivert    schedule 02.01.2012
comment
Это в конечном итоге сработало после некоторых других обручей, связанных с установкой правильной версии Android SDK и запуском mvn gae:unpack для загрузки соответствующего SDK appengine. Большое спасибо. - person Mark Schmit; 15.01.2012