【发布时间】:2010-10-20 00:08:51
【问题描述】:
我已经运行 eclipse(Helios Build id:20100617-1415),用于 eclipse 版本 2 (0.1.0.20100xxx) 的 sonotype maven 好几个月没有问题了。
我可以在命令行下“mvn install”,完美的战争,我可以在eclipse本地tomcat中运行webapp没问题。
然后今天早上,我在eclipse中启动了tomcat,点击了serlvet,并且找不到很多类。查看 eclipse 将库放在 webapp .metadata.plugins\org.eclipse.wst.server.core\tmp1\wtpwebapps\ge-api\WEB-INF\lib 中的位置,我看不到任何标准依赖库(例如 log4j)。
我做了我通常的 mvn 口头禅:
- 关闭椭圆
- 转到父项目的根目录
- mvn clean
- mvn 安装
- mvn elcipse:eclipse
- 重启eclipse
- 刷新所有项目,从父项目开始。
这没有帮助。
我尝试了所有可用的 m2eclipse 选项 - 没有任何帮助。
所以我尝试了 tomcat 口头禅:
- 打开日食
- 转到服务器选项卡
- 移除网页应用
- 窗口->首选项->服务器->运行时环境
- 删除tomcat 6
- 重启eclipse
- 再次添加 tomcat 6。
- 再次将 web 应用添加到其中。
- 在eclipse中重启tomcat服务器
这导致了同样的问题,maven 和 elcipse 互相讨厌并且拒绝说话。而且我没有改变任何东西,甚至没有改变一行 cmets,在它工作和它不工作之间。
我检查了每个配置 - 所需的 jar 正确地作为依赖项放置在每个正确的位置。见下文 - 所有 jar 都在类路径中 - 由 maven 正确放置。
还有一个“订单和导出”选项卡,虽然我不知道导出部分是什么意思:
上面的对话框在库旁边有复选框,所以我试着点击它们(嘿——我很绝望)。当我这样做并点击确定时,我总是会收到此错误:
我从我的 PC 中删除了 tomcat,重新添加并得到同样的错误。我可以愉快地运行一个没有库的测试 Webapp 项目,所以看起来没问题。
在 10 个小时的头发撕裂后,我注意到警告中的一些内容:
描述资源路径位置类型 类路径条目 M2_REPO/aopalliance/aopalliance/1.0/aopalliance-1.0.jar 不会被导出或发布。可能会导致运行时 ClassNotFoundExceptions。 ge-api P/ge-api 类路径依赖验证器消息
到底是什么原因造成的?
有很多关于这个错误的帖子,似乎说你必须
"open the J2EE Module Dependencies" UI 并在潜在条目表中选择类路径条目(解析的 JAR 将被打包在 WEB-INF/lib 或 EAR 的根目录,通过 Manifest 类路径引用,具体取决于依赖项的类型"
但是,我在 eclipse 的任何地方都没有类似“J2EE 模块依赖项”的东西。
这是我的方面/属性:
看,没有 J2EE,也没有配置选项。
无奈之下,我尝试“快速修复”警告。
“将关联的原始类路径条目标记为发布/导出依赖项。”
它以前有效,为什么我现在必须这样做?无论如何,我在 4 个子项目之一的 10 个库之一上尝试了这个,这些子项目到目前为止由父 pom 管理具有相同的依赖项(是的,我必须这样做 hack 40 次),现在我看到 2)事情有发生了:
- 它在 Java 构建路径的库选项卡中添加了“发布/导出依赖项:
如果我不使用自动修复系统,我找不到任何手动执行此操作的方法。
- 它给了我更多警告:
"描述资源路径位置类型 类路径条目 M2_REPO/log4j/log4j/1.2.15/log4j-1.2.15.jar 标记为发布/导出,但未在项目类路径上导出。 Eclipse 中的类路径可见性和运行时会有所不同。 ge-core P/ge-core Classpath Dependency Validator Message"
使用 maven 管理类路径有什么意义?
所以现在我一直在破解,直到某些东西正常工作,没有希望回到昨天,一切都正常工作:我用 maven 创建了项目,使用 pom 文件来做所有事情,而 eclipse 也随之而来。到现在为止。
这是我的父母 pom:
<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>com.skillkash.ge</groupId>
<artifactId>ge-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<name>ge-parent</name>
<modules>
<module>ge-api</module>
<module>ge-core</module>
<module>ibo-core</module>
</modules>
<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>
<dependencies>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.15</version>
<exclusions>
<exclusion>
<groupId>javax.jms</groupId>
<artifactId>jms</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jdmk</groupId>
<artifactId>jmxtools</artifactId>
</exclusion>
<exclusion>
<groupId>com.sun.jmx</groupId>
<artifactId>jmxri</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>5.12.1</version>
</dependency>
</dependencies>
</project>
这是我的本地 webapp pom:
<?xml version="1.0"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<artifactId>ge-parent</artifactId>
<groupId>com.skillkash.ge</groupId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<groupId>com.skillkash.ge</groupId>
<artifactId>ge-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>ge-api Maven Webapp</name>
<url>http://maven.apache.org</url>
<dependencies>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.skillkash.ge</groupId>
<artifactId>ibo-core</artifactId>
<version>0.0.1-SNAPSHOT</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.skillkash.ge</groupId>
<artifactId>ge-core</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
<build>
<finalName>ge-api</finalName>
</build>
</project>
这是我在 Eclipse 中的项目布局:
有谁知道出了什么问题,以及解决问题的正确方法是什么?
【问题讨论】:
-
只是关于您的 pom 的建议。定义您在 pom 中使用的所有依赖项和插件的版本。换句话说,意味着为每个依赖项或插件定义具有适当版本号的
标记。否则你会遇到不可预知的结果。 -
这是一个有趣的评论 - 也许 maven-compiler-plugin 更新了自己?
-
锁定插件版本以实现构建可重复性确实是最佳实践。但是在 maven 编译器插件的特殊情况下,它无论如何都被锁定在 Super POM 中(这并不意味着您不应该遵循最佳实践)。所以不,插件没有自行更新。
标签: java eclipse classpath maven m2eclipse