【问题标题】:Upload file in Spring 4 MVC java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory在 Spring 4 MVC java.lang.NoClassDefFoundError 中上传文件:org/apache/commons/fileupload/FileItemFactory
【发布时间】:2015-07-19 21:13:53
【问题描述】:

我尝试在 Spring 4 MVC 中编写文件上传程序。但是不断抛出以下异常。

java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory

我查看了与此问题相关的所有问题,并声称我没有犯任何错误。

我从 maven 下载了 commons-fileupload:1.3.1 库,并将以下行添加到我的 .iml 文件中

<orderEntry type="library" name="commons-fileupload:commons-fileupload:1.3.1" level="project" />

这个bean被添加到spring-mvc-servlet.xml

<bean id="multipartResolver"
            class="org.springframework.web.multipart.commons.CommonsMultipartResolver">

    <!-- setting maximum upload size -->
    <property name="maxUploadSize" value="100000" />

</bean>

另外我注意到库中找不到的类被划掉了(见下图)

无法确定这是异常的主要原因还是这些类仍然可用。

【问题讨论】:

    标签: spring maven spring-mvc file-upload


    【解决方案1】:

    我也遇到了同样的问题,在我的情况下,我发现 commons-io 依赖存在冲突,解决它后,一切正常!

    为了发现冲突,我运行了:

    mvn dependency:tree -Dverbose -Dincludes=commons-io

    结果是:

    [INFO] ------------------------------------------------------------------------
    [INFO] 
    [INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ smartplan ---
    [INFO] com.claro:smartplan:war:1.15.0
    [INFO] +- commons-fileupload:commons-fileupload:jar:1.3.1:compile
    [INFO] |  \- commons-io:commons-io:jar:2.2:compile
    [INFO] \- org.hibernate:hibernate-search-orm:jar:4.5.1.Final:test
    [INFO]    \- org.hibernate:hibernate-search-analyzers:jar:4.5.1.Final:test
    [INFO]       \- org.apache.solr:solr-analysis-extras:jar:3.6.2:test
    [INFO]          \- org.apache.solr:solr-core:jar:3.6.2:test
    [INFO]             +- org.apache.solr:solr-solrj:jar:3.6.2:test
    [INFO]             |  \- (commons-io:commons-io:jar:2.1:test - omitted for conflict with 2.2)
    [INFO]             \- (commons-io:commons-io:jar:2.1:test - omitted for conflict with 2.2)
    [INFO] ------------------------------------------------------------------------
    

    之后,我删除了对 pom.xml 的冲突依赖:

    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-search-orm</artifactId>
        <version>4.5.1.Final</version>
        <scope>test</scope>
        <exclusions>
            <exclusion>
                <groupId>commons-io</groupId>
                <artifactId>commons-io</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    

    【讨论】:

    • 再看主要解释。 ;)
    【解决方案2】:

    我遇到了同样的问题,刚刚解决了。 1) 确保 commons-fileupload 和 commons-io 都被列为您的依赖项。 2) 确保没有其他依赖项覆盖该功能。例如 Spring 默认使用 Servlet-api 3 上传机制...从你的项目模块依赖中删除它

    3) 对我来说关键解决方案的最后一点是,确保将两个依赖项都添加到 tomcat 部署中。我无法发布屏幕截图,因此我将为您提供仔细检查 jar 是否存在的路径。 在 Itellij Idea Project Structure --> Artifacts --> 将可用元素与输出布局进行比较。

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileItemFactory

      NoClassDefFoundError 异常表示找到 FileItemFactory 类但在创建实例时抛出异常,当类路径中的重复依赖 jar 文件或版本不匹配时会出现此类问题。

      【讨论】: