Я хотел бы, чтобы плагин maven eclipse восстанавливал мой .classpath при каждом запуске сборки, и я сделал это, используя следующую конфигурацию:
<!--
Generate a new .classpath each time the build is run, but don't try
to download sources or javadocs
-->
<profile>
<id>elipse-update</id>
<activation>
<file>
<exists>.classpath</exists>
</file>
</activation>
<build>
<plugins>
<plugin>
<artifactId>maven-eclipse-plugin</artifactId>
<executions>
<execution>
<phase>generate-sources</phase>
<goals>
<goal>eclipse</goal>
</goals>
<configuration>
<downloadSources>false</downloadSources>
<downloadJavadocs>false</downloadJavadocs>
</configuration>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
По какой-то причине это приводит к сбою подключаемого модуля maven jetty с ошибками ClassNotFoundException (он жалуется на отсутствие всех видов классов Spring). Конечно, он работал без ошибок, когда у меня не было установлен плагин maven eclipse. Вот пример того, о чем я говорю:
$ mvn jetty:run
[INFO] Scanning for projects...
...
[INFO] Starting jetty 6.1.22 ...
2010-02-11 20:53:08.984:INFO::jetty-6.1.22
2010-02-11 20:53:09.109:WARN::Could not instantiate listener org.springframework.web.context.ContextLoaderListener
java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderListener
at java.net.URLClassLoader$1.run(URLClassLoader.java:200)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:188)
at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
at org.codehaus.classworlds.RealmClassLoader.loadClassDirect(RealmClassLoader.java:195)
at org.codehaus.classworlds.DefaultClassRealm.loadClass(DefaultClassRealm.java:255)
at org.codehaus.classworlds.DefaultClassRealm.loadClass(DefaultClassRealm.java:274)
at org.codehaus.classworlds.RealmClassLoader.loadClass(RealmClassLoader.java:214)
at java.lang.ClassLoader.loadClass(ClassLoader.java:251)
Конечно, если я удалю этот раздел плагина Eclipse, я могу запустить Jetty, как и ожидалось:
$ mvn jetty:run
[INFO] Scanning for projects...
...
Feb 11, 2010 8:55:28 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization completed in 1672 ms
2010-02-11 20:55:28.687:INFO::Started SelectChannelConnector@0.0.0.0:8080
[INFO] Started Jetty Server
[INFO] Starting scanner at interval of 5 seconds.
Некоторые вещи, которые я знаю:
- Да, я активирую этот профиль только при наличии .classpath. Это кажется нелогичным, но у меня есть причина: у меня есть другой профиль, который активируется при отсутствии .classpath, который запускает плагин eclipse с опциями для загрузки исходного кода и javadocs, установленными в true. Я не хочу, чтобы это происходило при каждой сборке, поэтому я создал отдельную конфигурацию плагина для случая, когда путь к классам уже существует.
- Да, я мог бы просто создать свойства, содержащие значения параметров, которые я хочу изменить, вместо повторного указания всей конфигурации плагина. В этом случае я бы просто установил для свойства eclipse.downloadSources значение true или false, в зависимости от наличия пути к классу, и имел бы одно определение плагина в обычном разделе сборки.
Любой совет? Это странная проблема.
Спасибо,
LES