java - 如何使用相同的库在 Eclipse 中编译和运行?

标签 java maven compilation runtime-error nosuchmethoderror

我有一个作为 java 项目导入的 Maven 项目。当我运行它时,我得到

Handling error: NestedServletException, Handler dispatch failed; nested exception is java.lang.NoSuchMethodError: org.apache.commons.lang.time.DateUtils.addDays(Ljava/util/Date;I)Ljava/util/Date;

使用 this answer我得到了这一行:
[Loaded org.apache.commons.lang.time.DateUtils from file:/C:/Users/user/.m2/repository/commons-lang/commons-lang/2.0/commons-lang-2.0.jar]

但在 pom.xml它的:
        <dependency>
            <groupId>commons-lang</groupId>
            <artifactId>commons-lang</artifactId>
            <version>2.6</version>
        </dependency>

考虑到我在 Java Build Path 上有这个库:

enter image description here



enter image description here

我该如何解决这个问题?我在哪里可以保证比较我的运行和编译库?

编辑

这是 mvn dependency:tree -Dverbose -Dincludes=commons-lang 的输出:
    [INFO] com.companyName.gestao.projectName:projectName-webapp:war:1.0.0-SNAPSHOT
    [INFO] \- com.companyName.gestao.projectName:projectName-business:jar:1.0.0-SNAPSHOT:compile
    [INFO]    +- com.companyName.commons.utils:companyName-commons-utils:jar:1.14.5:compile
    [INFO]    |  \- softdes:softdes-all:jar:1.6.23:compile
    [INFO]    |     \- commons-lang:commons-lang:jar:2.6:compile (version managed from 2.0)
    [INFO]    \- net.sf.jasperreports:jasperreports:jar:companyName-6.4.0.4:compile
    [INFO]       \- org.codehaus.castor:castor-xml:jar:1.3.3:compile
    [INFO]          +- org.codehaus.castor:castor-core:jar:1.3.3:compile
    [INFO]          |  \- (commons-lang:commons-lang:jar:2.6:compile - version managed from 2.0; omitted for duplicate)
    [INFO]          \- (commons-lang:commons-lang:jar:2.6:compile - version managed from 2.0; omitted for duplicate)

business 运行相同的命令子项目(在与 webapp 项目相同的目录级别):
[INFO] com.companyName.gestao.projectName:projectName-business:jar:1.0.0-SNAPSHOT
[INFO] +- com.companyName.commons.utils:companyName-commons-utils:jar:1.14.5:compile
[INFO] |  \- softdes:softdes-all:jar:1.6.23:compile
[INFO] |     \- commons-lang:commons-lang:jar:2.0:compile

所以webapp取决于 business这取决于 companyName-commons-utils这取决于 softdes-all这取决于 commons-lang版本 2。但是 webapp必须使用 commons-lang版本 2.6。

我可以通过在 pom.xml 更改依赖顺序来完成此操作吗? ?

第二次编辑

添加后 <exclusion>commons-langbusiness依赖,我如上所述运行依赖树 maven。现在,除了 BUILD SUCCESS , maven 没有打印任何树,如下所示:
        PS C:\workspace\projectName-dev\webapp> mvn dependency:tree -Dverbose -Dincludes=commons-lang
    [INFO] Scanning for projects...
    [INFO]
    [INFO] ------------------------------------------------------------------------
    [INFO] Building Conciliador - webapp 1.0.0-SNAPSHOT
    [INFO] ------------------------------------------------------------------------
    [INFO]
    [INFO] --- maven-dependency-plugin:2.10:tree (default-cli) @ conciliador-webapp ---
    [WARNING] Using Maven 2 dependency tree to get verbose output, which may be inconsistent with actual Maven 3 resolution
    [INFO] ------------------------------------------------------------------------
    [INFO] BUILD SUCCESS
    [INFO] ------------------------------------------------------------------------
    [INFO] Total time: 8.629s
    [INFO] Finished at: Thu May 17 13:21:08 BRT 2018
    [INFO] Final Memory: 29M/494M
    [INFO] ------------------------------------------------------------------------
    PS C:\workspace\projectName-dev\webapp>

我发现 commons-lang依赖在里面 dependencyManagement如前所述 hereDateUtils仍然从 2.0 版本的 Jar 加载。可以做什么?

最佳答案

正如@LuisMuñoz 在评论中所述,我使用旧的依赖项为所有可能的库添加了排除项。即使有了这个 Eclipse 也坚持使用它的旧版本。我转到项目属性> Java 构建路径> 订购和导出,并优先于我较新的依赖版本 2.6 的所有其他内容。在此之后它起作用了。如果 Eclipse 配置具有最终决定权,那么听起来像 pom 定义根本无关紧要。

关于java - 如何使用相同的库在 Eclipse 中编译和运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50393323/

相关文章:

c++ - 静态常量成员初始化和模板(与静态函数相比)——这是如何工作的?

c - 强制进入 PLT 部分

编译 SQLite 以在 Windows Mobile 上运行

java - 常量 java.lang.OutOfMemoryError : PermGen space Arquillian + Wildfly 8. 1

maven - mockito 和 powermockito 的正确版本与 testng 和 java8 一起运行

java - 将 google-sample-code 从 github 导入到 java 应用程序

java - 字符串仅替换连续的空格

java - 如何从 servlet 中可移植地读取配置数据

java - 寻找简单的 Java 内存缓存

java - 迭代列表查找 boolean 属性,返回默认 false