`
s343174147
  • 浏览: 32500 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

jar包放置在WEB-INF/lib下和通过build path导入的区别是什么?

阅读更多

jar包直接拷贝到WEB-INF/lib下和以userLibrary形式引入的区别?

jar包放置在WEB-INF/lib下和通过build path导入的区别是什么?
问题: 1、web架包找不到 2、maven项目转变web项目通过 Deployment Assembly把架包添加到WEB-INF/lib引起的架包冲突

通俗的讲是和classLoader有关,对于纯java项目,它不存在WEB-INF目录,所以在引入jar包的时候一般都是通过buildpath直接引入,例如我要引入Spring3X,那么先定义一个user library,然后通过build path引入。

纯java项目使用的本地自己的JRE,那么classLoader在加载jar和class时候是分开的,对于我们自己编写的class,会在APP_HOME/bin下。导入的jar包或者user library的配置信息会出现在APP_HOME/.classpath文件中,ClassLoader会很智能去加载这些classes和jar。.classpath文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<classpath>
    <classpathentry kind="src" path="src"/>
    <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/jre6"/>
    <classpathentry kind="con" path="org.eclipse.jdt.USER_LIBRARY/Spring3.1.0"/>
    <classpathentry kind="lib" path="E:/Jar_Framework/cglib/cglib-2.2.2.jar" sourcepath="E:/Jar_Framework/cglib/cglib-src-2.2.2.jar"/>
    <classpathentry kind="lib" path="E:/Jar_Framework/commons-logging-1.1.1-bin/commons-logging-1.1.1/commons-logging-1.1.1.jar"/>
    <classpathentry kind="lib" path="E:/Jar_Framework/aopalliance-1.0/aopalliance-1.0.jar"/>
    <classpathentry kind="lib" path="E:/Jar_Framework/cglib/cglib-nodep-2.2.2.jar"/>
    <classpathentry kind="lib" path="E:/Jar_Framework/spring revelant/aspectj-1.6.12.jar"/>
    <classpathentry kind="lib" path="E:/Jar_Framework/spring revelant/aspectjweaver-1.6.8.jar"/>
    <classpathentry kind="lib" path="E:/Jar_Framework/spring revelant/asm-3.2.jar"/>
    <classpathentry kind="output" path="bin"/>
</classpath>

这样ClassLoader就会正确的找到所有需要的类。

而对于java web项目,就不一样了,虽然eclipse的workspace中仍然有.classpath文件,但即使你导入的了自己定义的user library,它也不会出现在.classpath中,这就是问题的关键。这到底是为什么呢???

对于java web项目,它最终不是通过本地的JRE去运行,而是部署到web 服务器,如Tomcat、Weblogic、WebSphere等,这些服务器都实现了自身的类加载器。
比如tomcat应用服务器,它有其自己的类加载器,根据J2EE的规范去%web-project%/WEB-INF/lib的规范去找相应的lib,这就是为什么我们发布的WEB应用要符合那个格式
以Tomcat典型结果为例,它的目录结构分别对应四个不同的类加载器,关系如下:

common      ---   CommonClassLoader

server          ---    CatalinaClassLoader

shared         ---    SharedClassLoader

webapps     ---    WebappClassLoader

我们的 web 应用都是部署到 webapps 目录下,而WebappClassLoader加载器专门负责加载 webapps 下所有web项目的 WEB-INF 下的类库和类文件。而我们通过 build path 引入的 jar 包自然不会被 WebappClassLoader 加载器加载,所以才会出现 ClassNotFoundException 。

eclipse引用library 是为了编译代码生成WEB-INF/classes里面的class文件使用,使用eclipse j2ee IDE时,会将WEB-INF/lib中所有的lib自动加入到library中
eclipse工程下的library是用来编译里面的src中java文件的
实际发布到tomcat时,仅仅只复制了WEB-INF/lib里面的jar包,所以出现eclipse可以正常编译但tomcat运行是找不到类,
如果你是用的eclipse j2ee IDE,你去WorkSpace\.metadata\.plugins\**.server.core\wtpwebapps找到运行时发布的工程就可以明白了
说白了就是用eclipse j2ee IDE开发web的时候,如果是编译java代码用到的jar可以作为library引用,如果是框架非java代码部分用到的jar就必须放在lib下面。

maven 转变成web项目时经常会出现架包冲突(servlet -api.jar这个架包会和Tomcat中的冲突)但是把项目打成架包就会不由冲突这是怎么解决的呢:

解决的方法是:<dependency>
   <groupId>javax.servlet</groupId>
   <artifactId>servlet-api</artifactId>
   <version>2.4</version>
   <scope>provided</scope>
 </dependency>
 把scope的值填成provided就可以了,意思是在打包时不把这个架包打进去

分享到:
评论

相关推荐

    Struts2-2.3.16 全jar包

    例如你建一Web Project,名为Struts2 导入项目所需要的jar包,放入/Struts2/WebRoot/WEB-INF/lib下面 方法一: 在struts2存放目录(以我的举例说明) F:\JavaWeb教程\ssh-jar\struts-2.2.3.16-all\struts-2.2.3.16\...

    spring2.5jar包.zip

    spring2.5jar包.zip

    SSH 配置相关信息

    2.1.1 选择Spring 1.2 选择jar包,并且把jar放置在/WEB-INF/lib下 select the library to add to the buildpath: --Spring 1.2 AOP Libraries --Spring 1.2 Core Libraries --Spring 1.2 Persistence Core Libraries...

    jstl1.2和standard1.1.2jar包

    使用JSP标准标签的时候,需要在web项目中使用这两个jar包,放在项目的web-inf/lib文件夹下。然后右键build path 即可. 同时附带两个jar 包的源码

    hadoop-eclipse-plugin-1.1.2.jar

    ${hadoop.root}/build/ivy/lib/Hadoop/common/commons-cli-${commons-cli.version}.jar" todir="${build.dir}/lib" verbose="true"/&gt; 改成 ${hadoop.root}/hadoop-core-${version}.jar" tofile="${build.dir}/lib/...

    MySQL5.5及其驱动连接jar包mysql-connector-java-5.1.19

    最后,在工程的webContent的web-Inf下找到lib文件夹,将jar文件加入,buildpath后即可连接。 另外,如果MySQL卸载了重装,需要先把注册表文件全部删完。可按F3快速查找,删除。,然后到C盘Document and Settings 下...

    jstl-1.2.jar包

    jstl1.2.jar无需其它jar包或配置即可使用,将它放在webapp/WEB-INF/lib目录下即可(对于低版本的IDE可能还需要Build Path一下)

    spring的jar包解决:DispatcherServlet

    Error loading WebappClassLoader org.springframework.web.servlet.DispatcherServlet java.lang.ClassNotFoundException: org.springframework.web.servlet...出问题,要将其复制到web-inf下面的lib文件夹下,才可以

    Crowd-TYPO3-Connector:适用于 Atlassian Crowd 的 TYPO3 SSO 连接器

    为了编译,运行以下命令: ./gradlew clean jar 然后,您需要将以下两个文件复制到 Crowd 中: cp build/libs/typo3-auth.jar /[path-to-crowd]/crowd-webapp/WEB-INF/lib/cp json-simple-1.1.1.jar /[path-to-...

    hadoop1.1.2 eclipse 插件

    在用eclipse 搭建hadoop插件时,apache不会提供插件,插件必须自己编译并且声称jar包。 1、将hadoop-1.1.2.tar.gz解压。比如:D:\hadoop-1.1.2。 2、进入D:\hadoop-1.1.2\src\contrib目录。将build-contrib.xml...

    mysql驱动包,mysql-connector-java-5.1.16.jar

    用于配置连接mysql数据库资源的主jar包,在java工程里可以把他放入lib里,添加进build path,web工程可以放入web-inf的lib里~~~

    jxljar .zip

    Java读取Excel所需的驱动,下载后将其粘贴在WebContent——WEB-INF——lib下并Add Build Path即可使用

    Eclipse上搭建并开始Struts的入门项目

    将lib目录下的所有jar包复制粘贴到刚刚创建的项目的WebContent/WEB-INF/lib目录下,在该目录下选中所有jar包后,右击添加至构建路径,英文版Build Path-&gt;Add Build Path 1.3.4、struts.xml编写 在src目录下,新建...

    在线购物商城系统,这是一个基于JavaWeb的购物商城

    打开WebContent --&gt; WEB-INF --&gt; lib ,然后将所有jar包 Build Path 导入sql文件夹里的mystore.sql到Mysql数据库中,根据本机数据库的端口号、用户名和密码修改db.properties 文件,以确保能成功加载配置文件并连接...

    ssm框架所需的全部jar包

    不使用maven,将lib文件夹直接替换WEB-INF的lib,BuildPath一下,ssm项目就可运行起来了

    运行jstl所需要的jar包

    javaweb项目的工程,两个文件直接放到webcontent里面的web-inf下的lib文件夹中;java项目的需要在项目根路径下创建个lib文件夹,然后粘贴进去,接着选中两个,右键选择build path点击add to build path

    WSDD + TOMCAT 一键部署Webservices

    [copy] Copying 1 file to e:\apache-tomcat-7.0.23\webapps\axis\WEB-INF\lib [delete] Deleting directory D:\java\wsdd\target deploy: [java] Processing file src/com/wsdd/deploy.wsdd [java] &lt;Admin&gt;Done...

    cms后台管理

    另导入common-lib下的jar包,删除jeecms-cms- identity-3.0.2-final.jar,jeecms-common-3.0.2-final.jar ,jeecms-core- identity-3.0.2-final.jar这三个jar包,切记:务必进行build path 3.修改jdbc链接,自己...

    ant1.9资源

    在task中是通过将属性名放在“${”和“}”之间,并放在task属性值的位置来实现的。 Ant提供了一些内置的属性,它能得到的系统属性的列表与Java文档中System.getPropertis()方法得到的属性一致,这些系统属性可参考...

    使用Jersey创建WebService要用到的jar库文件

    使用Jersey创建XML,JSON格式的RESTful WebService的时候,要用到的jar库文件大集合。使用的时候只需要把这些文件放在WEB-INF\lib目录,并在Java Build Path中添加引用就可以了。

Global site tag (gtag.js) - Google Analytics