【问题标题】:Spring Boot web app FileNotFoundException for mchange-commons-java-0.2.11.jarmchange-commons-java-0.2.11.jar 的 Spring Boot Web 应用 FileNotFoundException
【发布时间】:2018-08-05 13:40:11
【问题描述】:

我以前使用过 Spring Boot,但没有用于 Web 应用程序。我处于该项目的早期开发阶段(我刚刚完成了实体类的构建),并且在运行该项目时遇到了一个奇怪的异常:

java.io.FileNotFoundException: C:\Users\607337\.m2\repository\com\mchange\c3p0\0.9.5.2\mchange-commons-java-0.2.11.jar (The system cannot find the file specified)
at java.util.zip.ZipFile.open(Native Method) ~[na:1.8.0_162]
at java.util.zip.ZipFile.<init>(ZipFile.java:225) ~[na:1.8.0_162]
at java.util.zip.ZipFile.<init>(ZipFile.java:155) ~[na:1.8.0_162]
at java.util.jar.JarFile.<init>(JarFile.java:166) ~[na:1.8.0_162]
at java.util.jar.JarFile.<init>(JarFile.java:130) ~[na:1.8.0_162]
at org.apache.tomcat.util.compat.JreCompat.jarFileNewInstance(JreCompat.java:188) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.util.scan.JarFileUrlJar.<init>(JarFileUrlJar.java:65) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.util.scan.JarFactory.newInstance(JarFactory.java:49) ~[tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.util.scan.StandardJarScanner.process(StandardJarScanner.java:374) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.util.scan.StandardJarScanner.processURLs(StandardJarScanner.java:309) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.util.scan.StandardJarScanner.doScanClassPath(StandardJarScanner.java:266) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.tomcat.util.scan.StandardJarScanner.scan(StandardJarScanner.java:229) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.jasper.servlet.TldScanner.scanJars(TldScanner.java:262) [tomcat-embed-jasper-8.5.31.jar:8.5.31]
at org.apache.jasper.servlet.TldScanner.scan(TldScanner.java:104) [tomcat-embed-jasper-8.5.31.jar:8.5.31]
at org.apache.jasper.servlet.JasperInitializer.onStartup(JasperInitializer.java:101) [tomcat-embed-jasper-8.5.31.jar:8.5.31]
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5245) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1421) [tomcat-embed-core-8.5.31.jar:8.5.31]
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1411) [tomcat-embed-core-8.5.31.jar:8.5.31]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) [na:1.8.0_162]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_162]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_162]
at java.lang.Thread.run(Thread.java:748) [na:1.8.0_162]

这是我的 POM.xml(忽略所有设置为范围编译的事实,我会在某个时候更改它):

    <?xml version="1.0" encoding="UTF-8"?>

http://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0

<groupId>com.mdenis</groupId>
<artifactId>LEM2</artifactId>
<version>1.0-SNAPSHOT</version>

<name>Lab Equiment Manager</name>

<properties>
    <endorsed.dir>${project.build.directory}/endorsed</endorsed.dir>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.3.RELEASE</version>
</parent>

<dependencies>

     <!--JAVA-->
    <dependency>
        <groupId>javax</groupId>
        <artifactId>javaee-web-api</artifactId>
        <version>8.0</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>javax.servlet-api</artifactId>
        <version>4.0.1</version>
        <scope>provided</scope>
    </dependency>
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
    </dependency>

    <!--TOMCAT-->
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>compile</scope>
    </dependency>

    <!--SPRING-->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-orm</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-devtools</artifactId>
        <optional>true</optional>
    </dependency>

    <!--JTDS-->
    <dependency>
        <groupId>net.sourceforge.jtds</groupId>
        <artifactId>jtds</artifactId>
        <scope>compile</scope>
    </dependency>

    <!--HIBERNATE-->
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-core</artifactId>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-validator</artifactId>
        <version>6.0.10.Final</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.hibernate</groupId>
        <artifactId>hibernate-c3p0</artifactId>
        <scope>compile</scope>
    </dependency>

    <!--LOMBOK-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>compile</scope>
    </dependency>

    <!--JSTL-->
    <dependency>
        <groupId>javax.servlet</groupId>
        <artifactId>jstl</artifactId>
        <scope>compile</scope>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-compiler-plugin</artifactId>
            <version>3.7.0</version>
            <configuration>
                <source>1.7</source>
                <target>1.7</target>
                <compilerArguments>
                    <endorseddirs>${endorsed.dir}</endorseddirs>
                </compilerArguments>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-dependency-plugin</artifactId>
            <version>3.1.1</version>
            <executions>
                <execution>
                    <phase>validate</phase>
                    <goals>
                        <goal>copy</goal>
                    </goals>
                    <configuration>
                        <outputDirectory>${endorsed.dir}</outputDirectory>
                        <silent>true</silent>
                        <artifactItems>
                            <artifactItem>
                                <groupId>javax</groupId>
                                <artifactId>javaee-endorsed-api</artifactId>
                                <version>7.0</version>
                                <type>jar</type>
                            </artifactItem>
                        </artifactItems>
                    </configuration>
                </execution>
            </executions>
        </plugin>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <executions>
                <execution>
                    <phase>package</phase>
                    <goals>
                        <goal>single</goal>
                    </goals>
                </execution>
            </executions>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef>
                </descriptorRefs>
                <finalName>LabEquipmentManager</finalName>
                <appendAssemblyId>false</appendAssemblyId>
            </configuration>
        </plugin>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
            <version>2.0.3.RELEASE</version>
            <executions>
                <execution>
                    <goals>
                        <goal>repackage</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

有些东西在错误的文件夹中寻找这个文件,因为它不在我的存储库中。要么就是我缺少依赖项或类似的东西。有人见过这个吗?

******更新******

忘记了这个细节,但该项目实际上已部署并正常运行。我能够运行代码来创建实体,而不能。这更像是一种信息类型的异常,但我仍然希望它消失!

谢谢!

【问题讨论】:

  • 只是不要使用 c3p0 作为 DataSource,还要让 spring 管理 DataSource。从你的依赖关系以及你如何表达它们来看,你正在努力不使用 Spring Boot(因为它看起来你正在解决它)。
  • 老实说,我什至不知道它带有内置的东西,我对 Spring 整体还是很陌生,并且大部分时间都在学习。我目前正在将此类用于数据源:com.mchange.v2.c3p0.ComboPooledDataSource。 Spring boot 提供什么来替代它?我很乐意通过使用其他东西来消除这个错误!
  • 并不是 Spring 捆绑了某些东西(尽管 Spring Boot 默认使用 HikariCP),但 Hibernate 团队建议使用外部管理的DataSource 来支持 Hibernate管理它。但是 Spring Boot 将通过向您的 application.properties 添加几个属性来自动配置数据源。

标签: java spring spring-boot tomcat filenotfoundexception


【解决方案1】:

您的代码中似乎引用了 mchange c3p0 框架,但我在您的 pom 文件中没有看到对它的引用。

尝试将此作为依赖项添加到您的 pom 文件中:

<dependency>
    <groupId>com.mchange</groupId>
    <artifactId>c3p0</artifactId>
    <version>0.9.5.2</version>
</dependency>

【讨论】:

  • 遗憾的是我之前尝试过,但没有效果。奇怪的是,该文件已经在我的本地 Maven 存储库中,但在不同的文件夹中:C:\Users\607337\.m2\repository\com\mchange\mchange-commons-java\0.2.11
  • 实际上经过一番研究,它看起来不像它正在搜索的文件应该在它正在搜索它的文件夹中。即Jar文件属于具有不同路径的库。尝试删除(或移动)文件夹“C:\Users\607337\.m2\repository\com\mchange\”并重新构建。
  • 没错,文件在那里,但在 C:\Users\607337\.m2\repository\com\mchange\mchange-commons-java\0.2.11 下。
  • 同时尝试清理你的项目。
  • 我刚刚删除了整个 mchange 文件夹并点击了 Netbeans 中的下载声明的依赖项,它再次提取了完全相同的文件夹/文件结构。
【解决方案2】:

经过一些研究,我发现 Hikari 实际上是捆绑到 Spring Boot 中的。我删除了 C3P0 并用 Hikari 的 HikariDataSource 替换了我的 ComboPooledDataSource 实现。一切都像魅力一样运作,当然错误消失了。

【讨论】:

  • 不要。 Spring Boot 将通过将spring.datasource.* 属性添加到您的application.properties 来自动配置它。这就是为什么我提到你正在努力不使用 Spring Boot。从您的依赖项、插件等判断。您基本上正在重新做 Spring Boot 为您提供的所有开箱即用的东西。
  • 使用 Spring Boot 的替代方案是什么?使用 Spring-MVC?我问是因为我也不太清楚何时使用 Spring Boot,以及它实际上是什么。到目前为止,我发现它为我提供的最大优势是它有一个嵌入式服务器,我可以使用它从命令行为应用程序提供服务,而无需将其部署在单独的服务器中。
  • Spring Boot 为您处理了很多通常需要自己编写代码的“管道”。到目前为止,我觉得很棒的一件事是,您可以使用良好的主要方法方法构建 Web 应用程序。是的,将 Tomcat 嵌入到 jar 中对我来说是一个巨大的游戏规则改变者。它提供了很多你通常必须包括在内的东西,而且我似乎每天都会发现一件很棒的新东西。
【解决方案3】:

您可以在 spring-boot application.properties 中禁用对 tomcat 的 jar 扫描

server.tomcat.additional-tld-skip-patterns=*.jar

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-15
    • 1970-01-01
    • 2021-08-01
    • 2018-08-16
    • 1970-01-01
    • 1970-01-01
    • 2021-09-22
    • 2021-06-23
    相关资源
    最近更新 更多