我有一个基于Maven的2模块Intellij项目,其组织方式如下:
MyAppProject
--->MyAppDomain (builds a JAR)
--->MyAppWAR (builds a WAR, including the JAR above)
我可以使用Maven构建项目,结果WAR包含MyAppDomain.JAR作为依赖项:
<dependency>
<groupId>com.mycompany.myapp</groupId>
<artifactId>MyAppDomain</artifactId>
<version>1.0.0</version>
</dependency>
此WAR适用于Tomcat。但是,如果我使用Intellij Idea Ultimate的整洁Tomcat集成构建它,则WAR会因此错误而失败(格式化为可读性):
org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor#0':
Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException:
Error creating bean with name 'entityManagerFactory' defined in ServletContext resource [/WEB-INF/config/data-context.xml]:
Invocation of init method failed; nested exception is java.lang.IllegalStateException:
Conflicting persistence unit definitions for name 'caPersistenceUnit':
file:/C:/JavaSoftware/apache-tomcat-6.0.32/webapps/MyApplication/WEB-INF/lib/MyAppDomain.jar, file:/C:/JavaSoftware/apache-tomcat-6.0.32/webapps/MyApplication/WEB-INF/lib/MyAppDomain-1.0.0.jar
因此,似乎IDEA包含Maven指定的JAR(MyAppDomain-1.0.0.jar),并且还包含它自己的包含所有相同文件的JAR(MyAppDomain.jar)版本。
我在Intellij IDEA中找到了解决这个问题的方法是徒劳无功的 - 有人知道如何阻止这种行为(包括共同居住的项目)吗?
答案 0 :(得分:1)
我无法找到如何关闭此行为,但我找到了正确构建WAR的解决方法。
1. Select "Run -> Edit Configurations" from the menu.
2. Select your"Tomcat Server" job.
3. Click the "Deployment" tab.
4. At the bottom, where it says "Before Launch: Another Configuration," delete the "Make" option.
5. Click the "+" (plus) sign and select your Maven Build task to add it to the "Before Launch" list.
通过这样做,Intellij将使用您设置的Maven构建任务来创建WAR,而不是使用自己的“Make”命令。
答案 1 :(得分:1)
我在IDEA遇到了同样的问题。
发生此问题的原因是您在启动Tomcat之前在IDEA中运行了mvn clean package(or install)
。
mvn clean package
将生成Maven指定的JAR(MyAppDomain-1.0.0.jar),但启动
Tomcat将生成没有版本化的JAR(MyAppDomain.jar)。这就是你的类路径中有两个相同的jar的问题。
要解决此问题,只需在启动Tomcat之前在IDEA中手动运行mvn clean
,如果您已经运行mvn clean package
。
答案 2 :(得分:1)