所以,我创建了一个 Spring Maven 项目,一个 Dao 项目,效果很好。所有代码都在正确的位置,所有单元测试都运行,我可以进行 mvn clean install。我可以在目标目录中看到有一个构建 jar,其中的所有内容看起来都很好。我还可以确认,当我检查我的本地 .m2/repository 时,我刚刚构建的最新 jar 就在那里。
这是 pom.xml 的一小部分:
<modelVersion>4.0.0</modelVersion>
<groupId>com.tom.myproject</groupId>
<artifactId>myproject-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>My Project DAO</name>
现在,我正在为我的 UI 创建一个新的 Spring Maven Web 项目,这个 pom.xml 的开头如下:
<modelVersion>4.0.0</modelVersion>
<version>0.0.1-SNAPSHOT</version>
<groupId>com.tom.myproject</groupId>
<artifactId>myproject-ws</artifactId>
<name>My Web Project</name>
<packaging>war</packaging>
同样在这个 pom.xml 文件中,我拥有的第一个依赖项之一是:
<!-- My DAO ProjectDependencies -->
<dependency>
<groupId>com.tom.myproject</groupId>
<artifactId>myproject-dao</artifactId>
<version>0.0.1-SNAPSHOT</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
我可以在 Eclipse 中看到,当我尝试从这个 dao jar 访问类时,这似乎工作正常。当我在这里编译代码时,一切正常。而当我执行“mvn clean install”来构建这个war时,我可以看到目标目录,所有需要的类和jar都进来了,显然WEB-INF中有hibernate、logging和spring类/lib 目录。
现在这是问题出现的地方......为什么 myproject-dao 在 WEB-INF/lib 下显示为 WEB-INF/lib/myproject-dao-0.0.1-SNAPSHOT.jar 但显示为目录,而不是罐子?
当然,当我拉入其他 jar 时,它们只是 .jar 文件而不是目录。
我应该补充一点,当您在 Maven 依赖项下查看 Eclipse 项目时,所有其他 jar 的图标都将它们显示为文件。myproject-dao.jar 的图标使用文件夹/目录的图标,因此很明显正在创建一个名为“myproject-dao.jar”的目录,而不是一个将内容压缩到 jar 文件中的文件。
当我构建战争文件并部署战争时,应用程序说它在 myproject-dao.jar 目录中找不到任何类。我必须从 WEB-INF/lib 目录中删除文件夹“myproject-dao.jar”并手动复制文件“myproject-dao.jar”。然后我可以清楚地看到表示这确实是一个文件的图标。
这可能是一个简单的修复,所以如果你能帮助我,那就太好了。
回答:
我没有使用 maven-assembly-plugin。但是,我确实发现了问题所在。
我的 DAO 项目和 WEB 项目都在同一个工作空间中,并且 DAO 项目是打开的,结果 Eclipse 中显示的 maven 依赖是一个文件夹图标,而不是 jar 图标。当我关闭 DAO 项目并回顾对 WEB 项目 pom.xml 文件的 maven 依赖项时......现在它将图标显示为 jar 而不是文件夹。
所以,我所要做的就是用 maven 构建我的 dao.jar 文件,当它成功时,它就完成了。然后我必须在 Eclipse 中关闭项目。在我的 web 项目 pom.xml 文件中,该图标现在将其显示为 jar 文件,并且在构建时,它将拉入 jars。
我想如果一个人正在处理几个先前的项目,这是一个好处,你确实有机会在战争运行时查看 jar 文件中的内容。
就我而言,我知道我的 dao.jar 正在工作,所以我可以构建它,关闭项目,然后在我需要的任何地方使用该 jar。