1

我有一个基于 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 中关闭它的方法 - 有人知道如何阻止这种行为(包括共同驻留项目)吗?

4

3 回答 3

1

我在IDEA中遇到了同样的问题。

出现这个问题是因为你mvn clean package(or install)在启动Tomcat之前已经在IDEA中运行过。

mvn clean package生成 Maven 指定的 JAR(MyAppDomain-1.0.0.jar),但启动 Tomcat 将生成没有指定版本的 JAR(MyAppDomain.jar)。这就是您的类路径中有两个相同的 jar 的问题。

要解决这个问题,如果您曾经运行过,只需在启动 Tomcat 之前在您的 IDEA 中手动运行即可mvn cleanmvn clean package

于 2013-12-27T05:58:40.220 回答
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”命令。

于 2013-08-07T17:10:22.537 回答
1

我也刚遇到这个问题。生成的战争包含相同依赖项的两个版本(这是一个模块),这导致了问题。

我必须在 IntelliJ 中编辑我的 tomcat 启动配置:

  1. 编辑启动配置
  2. 单击您的 tomcat 配置,然后转到部署选项卡
  3. 在窗口底部,单击加号图标添加“启动前”任务
  4. 选择运行 Maven 目标
  5. 将“干净”写为命令行并接受 maven 目标清洁
  6. 将任务移到顶部,在 Build 之前
于 2017-05-25T11:14:34.517 回答