Es gibt zwei JAR-Pakete commons-fileupload-1.3.2.jar und commons-io-2.5.jar
Ich habe diese beiden Pakete zunächst wie andere Pakete, also externe Bibliotheken, nach draußen gestellt.
Schreiben Sie die relevanten Klassen. Konfigurieren Sie anschließend das Servlet und Zuordnung in web.xml
<servlet>
<servlet-name>mytest</servlet-name>
<servlet-class>servlet.FileUploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>mytest</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>
Dann startet Tomcat nicht, Meldung:
Kritisch: ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Komponente konnte nicht gestartet werden
java.lang.NoClassDefFoundError: org/apache/commons/fileupload/FileUploadException
Frage:
Müssen die beiden Jars commons-fileupload und commons-io unter WEB-INF platziert werden?
Warum kann es nicht in externen Bibliotheken platziert werden? Alle meine anderen Pakete können in External verwendet werden. Warum kann auf diese beiden nicht zugegriffen werden?
Ich habe eine neue Bibliothek unter WEB-INF erstellt und diese beiden Pakete dort eingefügt, als ich sie veröffentlicht habe, und dann lief es normal. Was ist das Besondere an diesen beiden Paketen? Warum müssen Sie WEB-INF darunter einfügen?
idea的tomcat插件发布应用是这个Artifact
看看你的当前项目的Artifact是不是没有External Libraries里面依赖的jar包
那就再这个Artifact里面加上lib(在项目
web/WEB-INF/lib
下放入jar包会自动加到Artifact里面。这就是为什么你说的为什么放到WEB-INF才行的原因。当然你完全可以把依赖jar包还放在External Libraries,在Artifact这里添加上就行,不过还是推荐把依赖的jar包放在项目web/WEB-INF/lib
里面,把这个文件夹作为一个jar库放在External Libraries)之后在启动tomcat依赖问题得到解决
先纠正一下,是
WEB-INF
目录,不是WEB-INFI。发布之前,你是用maven对项目打包的吗?如果maven中有
commons-fileupload
的依赖,打包时会放在WEB-INF/lib
下的。运行时依赖的包
放在WEB-INF/lib中的jar包,即使不引入为依赖,package的时候,也会默认被打到最终的war包里(位置依然是WEB-INF/lib)。至于位置不在WEB-INF/lib下的jar包,则需要引入为依赖,才会在package时打入最终的war包(依然会位于WEB-INF/lib)。引入为依赖的方法可参考3楼的解答
我也遇到过这个问题,我发现Import的Jar发布时没添加到WEB-INF/lib下,在Tomcat目录下确实看不到相应的Jar,于是我每次Import后都再复制粘贴到的WEB-INF/lib下,甚至有时直接不Import直接就往Referenced Libraries和WEB-INF/lib下粘贴。