ClassNotFound 与 Maven WAR 文件
ClassNotFound With Maven WAR file
我四处寻找解决方案,但找不到任何合理的方法。其中大部分与 JAR 相关。我不断收到这个令人沮丧的错误:
15-Jan-2020 11:36:06.605 SEVERE [Catalina-utility-1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener]
java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:269)
来自commons-logging.jar (1.2).
我添加了我的依赖,比如:
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
版本来自父pom.xml
我有这两个插件注意:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<inherited>false</inherited>
<executions>
<execution>
<id>pal-copy-dependencies</id>
<phase>generate-sources</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<inherited>false</inherited>
<configuration>
<excludeScope>provided</excludeScope>
<excludeClassifiers>shared</excludeClassifiers>
<excludeTransitive>true</excludeTransitive>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
<overWriteIfNewer>true</overWriteIfNewer>
<silent>true</silent>
<useBaseVersion>false</useBaseVersion>
</configuration>
</execution>
</executions>
</plugin>
和
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<inherited>false</inherited>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<addDefaultEntries>true</addDefaultEntries>
<addBuildEnvironmentEntries>true</addBuildEnvironmentEntries>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<classpathPrefix>WEB-INF/lib/</classpathPrefix>
</manifest>
</archive>
<attachClasses>true</attachClasses>
<classesClassifier>shared</classesClassifier>
<failOnMissingWebXml>true</failOnMissingWebXml>
<includeEmptyDirectories>true</includeEmptyDirectories>
<outputDirectory>${project.basedir}\lib</outputDirectory>
<webResources>
<webResource>
<directory>src/main/resources/ProcessOrderService</directory>
<include>*.*</include>
<targetPath>/ProcessOrderService/wsdl/</targetPath>
</webResource>
</webResources>
</configuration>
</plugin>
我不知道我做错了什么。更重要的是,当我将 commons-logging.jar 放在 Tomcat 的 lib 文件夹中时,它就像一个魅力。
我在这个 war 文件中有一个依赖项:
<dependency>
<groupId>com.test.mypackage</groupId>
<artifactId>common-files</artifactId>
<version>${project.version}</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
这也使用 commons-logging,范围 compile
。但这种依赖性必须保持 provided
。无法改变!
可能导致冲突或其他问题的唯一其他依赖项是 activemq-core.jar,但我向其添加了排除参数。但是还是不行。
如有任何帮助,我们将不胜感激!谢谢!
Tomcat 类加载器将应用程序本地依赖项视为最后 (https://tomcat.apache.org/tomcat-8.5-doc/class-loader-howto.html)。
我最好的猜测是 Tomcat 类路径中某处已经有这个库(不同版本)(这并不奇怪,因为它是一个 Apache 日志库)。
您可以尝试将 commons-logging 定义为可选,它不会被传递导入并将使用 Tomcat 中可用的内容(假设该版本适用于您的代码)。或者,您需要找到图书馆并 replace/upgrade 它。
我四处寻找解决方案,但找不到任何合理的方法。其中大部分与 JAR 相关。我不断收到这个令人沮丧的错误:
15-Jan-2020 11:36:06.605 SEVERE [Catalina-utility-1] org.apache.catalina.core.StandardContext.listenerStart Exception sending context initialized event to listener instance of class [org.springframework.web.context.ContextLoaderListener] java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory at org.springframework.web.context.ContextLoader.initWebApplicationContext(ContextLoader.java:269)
来自commons-logging.jar (1.2).
我添加了我的依赖,比如:
<!-- https://mvnrepository.com/artifact/commons-logging/commons-logging -->
<dependency>
<groupId>commons-logging</groupId>
<artifactId>commons-logging</artifactId>
</dependency>
版本来自父pom.xml
我有这两个插件注意:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-dependency-plugin</artifactId>
<inherited>false</inherited>
<executions>
<execution>
<id>pal-copy-dependencies</id>
<phase>generate-sources</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<inherited>false</inherited>
<configuration>
<excludeScope>provided</excludeScope>
<excludeClassifiers>shared</excludeClassifiers>
<excludeTransitive>true</excludeTransitive>
<outputDirectory>${project.build.directory}/classes/lib</outputDirectory>
<overWriteIfNewer>true</overWriteIfNewer>
<silent>true</silent>
<useBaseVersion>false</useBaseVersion>
</configuration>
</execution>
</executions>
</plugin>
和
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<inherited>false</inherited>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<addDefaultEntries>true</addDefaultEntries>
<addBuildEnvironmentEntries>true</addBuildEnvironmentEntries>
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
<addDefaultSpecificationEntries>true</addDefaultSpecificationEntries>
<classpathPrefix>WEB-INF/lib/</classpathPrefix>
</manifest>
</archive>
<attachClasses>true</attachClasses>
<classesClassifier>shared</classesClassifier>
<failOnMissingWebXml>true</failOnMissingWebXml>
<includeEmptyDirectories>true</includeEmptyDirectories>
<outputDirectory>${project.basedir}\lib</outputDirectory>
<webResources>
<webResource>
<directory>src/main/resources/ProcessOrderService</directory>
<include>*.*</include>
<targetPath>/ProcessOrderService/wsdl/</targetPath>
</webResource>
</webResources>
</configuration>
</plugin>
我不知道我做错了什么。更重要的是,当我将 commons-logging.jar 放在 Tomcat 的 lib 文件夹中时,它就像一个魅力。
我在这个 war 文件中有一个依赖项:
<dependency>
<groupId>com.test.mypackage</groupId>
<artifactId>common-files</artifactId>
<version>${project.version}</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
这也使用 commons-logging,范围 compile
。但这种依赖性必须保持 provided
。无法改变!
可能导致冲突或其他问题的唯一其他依赖项是 activemq-core.jar,但我向其添加了排除参数。但是还是不行。
如有任何帮助,我们将不胜感激!谢谢!
Tomcat 类加载器将应用程序本地依赖项视为最后 (https://tomcat.apache.org/tomcat-8.5-doc/class-loader-howto.html)。
我最好的猜测是 Tomcat 类路径中某处已经有这个库(不同版本)(这并不奇怪,因为它是一个 Apache 日志库)。
您可以尝试将 commons-logging 定义为可选,它不会被传递导入并将使用 Tomcat 中可用的内容(假设该版本适用于您的代码)。或者,您需要找到图书馆并 replace/upgrade 它。