为什么maven eclipse插件打破了maven jetty插件?

时间:2010-02-12 02:01:08

标签: eclipse maven-2 jetty maven-jetty-plugin

我想让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

2 个答案:

答案 0 :(得分:2)

我怀疑Maven Eclipse插件 mess 做了一些类路径woodo,后来影响了jetty插件。

但说实话,这不是一种使用Eclipse插件的常用方法,至少在我不知情的情况下。大多数人不会在构建中包含它,它们只是在POM发生变化时运行它,而这通常不会在每次构建时发生。此外,如果我记得很清楚的话,触摸.classpath会混淆Eclipse并强制进行项目的干净重建,这非常烦人。

所以最后,我很抱歉,这似乎引入了更多的烦恼而不是好处。您可以尝试打开Jira issue

答案 1 :(得分:1)

当存在.classpath时,你真的不想在每个构建上运行maven-eclipse-plugin。我无法确切地告诉你它对类路径的作用,但这不是它的用途。假设你运行它时只运行eclipse:eclipse(或其他一些目标)。

为什么要继续重新运行呢?