【发布时间】:2014-04-30 18:58:54
【问题描述】:
好吧,这快把我逼疯了……我正在处理一个 Maven 项目,并且我有 3rd Party JAR 依赖项,这些依赖项会导致我在 IntelliJ 上出现编译错误,但在 STS 中却没有。
我的简化项目结构是这样的:
FERPAPortlet
-src
--main
---java
----edu.sandiego.parent
-----FERPAPortlet
---resources
---webapp
----META-INF
----WEB-INF
-----jsp
-----lib <----- 3rd Party JARS are here
-----liferay-display.xml
-----liferay-plugin-package.xml
-----liferay-portlet.xml
-----portlet.xml
-----web.xml
--test
-pom.xml
在 SpringSource Tool Suite 中,如果我运行 compile/package,一切运行正常!事实上,如果我先在 STS 中运行它,然后用 IntelliJ 重新打开,问题就解决了。尽管如此,我更喜欢 IntelliJ 而不是 STS...
当我运行 maven compile 时,我得到的示例错误是这样的:
[INFO] -------------------------------------------------------------
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] C:\Users\rico.r-10\Documents\GitHub\github.sandiego.edu\FERPAPortlet\src\main\java\edu\sandiego\parent\FERPAPortlet.java:[3,35] error: package com.sghe.luminis.core.spring does not exist
但是,当我导航到该行时,IntelliJ 不会将其突出显示为红色作为错误,我实际上可以 Ctrl+单击,IntelliJ 将导航到库。
我已经通过 项目结构 > 项目设置 > 模块 > MyModule > 依赖项选项卡。
我在 IntelliJ 中缺少的 STS 正在做什么?
编辑:得到它的工作!这就是我所做的。 我用 3rd Party Jars 删除了 lib 文件夹。 然后我通过命令行手动添加了这些 Jar 文件,如下所示:
mvn install:install-file "-Dfile=C:\luminis5libs\luminis-dal.jar" "-DgroupId=com.sghe.luminis" "-DartifactId=luminis-dal" "-Dversion=1.6.0" "-Dpackaging=jar"
最后,我修改了 POM 以包含这些依赖项,如下所示:
<dependency>
<groupId>com.sghe.luminis</groupId>
<artifactId>luminis-dal</artifactId>
<version>1.6.0</version>
</dependency>
【问题讨论】:
-
你不应该有一个 lib 目录。使用 maven,所有的 jars 都来自本地存储库,并被复制到目标(构建)目录下的 lib 目录中。检查您的 maven 依赖项,并删除 lib 及其下的所有内容。您的错误是因为 intellij 没有在您定义的路径中看到 jars。 STS 基于 eclipse,它可以让你摆脱任何你想要的粗制滥造的旧流程——Intellij 更专业,在 maven 项目上,需要可移植的项目。
-
@EngineerDollery,谢谢!我会试一试。我过度提供了您的帮助,但您能否指出定义良好流程的文档或链接?我将不得不与我的同事争论最佳实践...
-
在这种情况下,我提到的做法是提供您的 jars/wars 依赖项的完整列表,以便部署您的应用程序的人可以决定如何满足这些依赖项。例如,如果您的 web-inf/lib 目录中的一个库很大,并且您的客户想要部署许多使用它的 Web 应用程序,他们可能会选择让 Web 容器提供该库,这样就只有一份。如果他们不知道您正在使用它,那么他们就无法提供它。更糟糕的是,如果他们不知道您正在使用它,并且他们提供自己的,略有不同
-
[cont] 版本略有不同,那么您的应用程序中可能会出现细微的错误。
-
此外,我们倾向于拥有一套网络应用程序,而不仅仅是一个,而且它们都倾向于依赖相同的库。如果这些都在主 pom 中引用,那么更新所有 web 应用程序以同时使用新版本的库相对简单。有时,这是非常理想的,有时不太理想,但 Maven 为我们提供了选择。在项目中嵌入库严重限制了我们这样做的能力。它甚至限制了我们知道 Web 应用甚至使用特定版本的库的能力。
标签: maven intellij-idea compilation portlet sts-springsourcetoolsuite