jetty;linux 目录结构

Posted 找*寻*

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了jetty;linux 目录结构相关的知识,希望对你有一定的参考价值。

【说明】今天看了看jetty这个web容器,上午看基础理论框架知识(后面半点没用到),下午下载了jetty,并且在上面部署了一个war应用,晚上在做eclipses整合jetty的时候出现了问题,下载插件之后不能运行,随之又对jetty插件运行方式产生了疑问

一:今日完成

1)jetty的官方简单介绍

Jetty provides a Web server and javax.servlet container, plus support for HTTP/2, WebSocket, OSGi, JMX, JNDI, JAAS and many other integrations.These components are open source and available for commercial use and distribution.

Jetty is used in a wide variety of projects and products, both in development and production. Jetty can be easily embedded in devices, tools, frameworks, application servers, and clusters. See the Jetty Powered page for more uses of Jetty.

The current recommended version for use is Jetty 9 which can be obtained here: Jetty Downloads. Also available are the latest maintenance releases of Jetty 8 and Jetty 7.

The Jetty project has been hosted at the Eclipse Foundation since 2009. Prior releases of Jetty have existed in part or completely under the Jetty project at the The Codehaus and Sourceforge before that. See the About page for more information about the history of Jetty.

2)启动jetty

3)了解jetty_base和jetty_home的区别

4)部署test.war

5)安装插件

二:明日计划

1)搞定插件直接部署到jetty

2)搞定插件直接部署到tomcat

3)了解一下jboss和jetty的联系

三:疑难问题

1)eclipse里如果用jetty启动项目,是不是只能用jetty server adapter或run-jetty-run插件启动,不能用本地的jetty?那以后部署到生产环境怎么保证项目能在生产环境的jetty里运行呢?

2)maven的pom.xml里配置了jetty插件,有什么作用呢?开发环境可以用run-jetty-run启动,生产环境可以放到webapp里,这个jetty插件在什么时候用?

3)网上说在项目目录下用mvn jetty:run启动,如果是生产环境,还要安装maven?

 4)执行这个启动命令mvn jetty:run,jetty是哪里来的?

   <groupId>org.eclipse.jetty</groupId>
   <artifactId>jetty-maven-plugin</artifactId>
   <version>9.0.5.v20130815</version>

四:思考总结

上午看的jetty原理和框架知识现在半点用不上,还是等遇到了再详细研究吧

jetty9.1以后出现了jetty.base这个概念,指的就是你的webapps目录所在的路径(当然这个webapps目录也是可以修改的,但大多数应用都是直接用这个webapps了),分几种情况说明下:

1、下载下来的jetty直接使用,也就是将你的war文件直接放在解压目录的webapps下,然后通过java -jar start.jar启动,此时的jetty.base和jetty.home都是当前目录,可以通过java -jar start.jar --list-config来查看下:

2、看到那个demo-base文件夹了么(jetty版本为9.0以后),这个文件夹就是jetty用来做jetty.base的事例用的,进去看下,目录结构这样:

demo-base中包含可以启动一个web应用的所有文件.也就是说,使用这个目录中的文件也可以启动jetty,如何启动的,进入demo-base,然后java -jar ../start.jar进行启动,再次使用--list-config进行查看,只有很少的内容,且内容来源都是demo-base中,其中有jetty.base和jett.home,看到了吧,不一样了,jetty.base是当前目录:

也就是说,可以随意建立一个目录当做jetty.base,然后在该目录中放置war包启动需要的jetty配置文件即可.

3、在系统内任意目录建立一个文件夹,当做jetty.base使用(其实和第2种情况一样,启动时通过指定start.jar就可以启动了)

 

还有几个点需要注意下:

    1、jetty.home默认就是start.jar所在的目录

    2、可以通过在java -jar start.jar后面跟上jetty.base来指定jetty.base目录:

        java -jar start.jar jetty.base=...

    3、jetty.home其实就是jetty的默认配置文件、默认的模块定义目录;jetty.base就是为了某个webapp自定义的一个配置文件目录

--list-modules:此命令将返回当前服务所有可用的模块,同时也会显示本地的模块,信息包括模块实现的顺序,依赖模块以及相应的jar信息

--list-config:显示运行环境和配置文件等信息 

在Jetty9,只有Jetty基路径下的配置文件被编辑,属性才会被修改

1、web应用的结构:

在说jetty部署之前先说说servlet规范定义的web应用的结构,应该都很熟悉,这里罗列一下:

WEB-INF/

WEB-INF/lib/

WEB-INF/classes/

WEB-INF/web.xml

以上内容是一个webapp必须有的,其中在启动的时候jetty的WebAppClassLoader会先从classes中加载类文件,然后在去lib目录下加载类文件

2、部署方式

 jetty支持多种部署方式,比如servlet规范中的满足以上内容条件的war包,jetty自己提供的xml部署描述符,或者直接就是一个满足servlet规范的文件夹(war包本来也是要解压的)

(1)简单部署,直接将war包或者解压的war目录放入jetty.home/webapps目录下,然后启动,jetty的部署扫描器会找到部署的内容,然后自动设置contextPath为该war包或war目录的名字即可完成部署,但要注意war的名字,当war的名字为root.war或者文件夹的名字为war的时候,contextPath就是root,在浏览器中访问的时候就不需要输入contextPath了,而直接访问根目录,比如http://localhost:8080/就可以访问到root.war这个应用了,当你的jetty只需要部署这一个应用,将其命名为root.war还是可以滴.

    当你需要使war包的名字和contextPath不同,这时候怎么办呢?就是第二种方式:

(2)XML部署描述符,这种方式就是在webapps目录中不放除了xml文件描述符之外的任何war包或者war目录,jetty部署扫描器能自动加载到这个xml文件,然后通过xml文件中定义的WebAppContext实例中的war和contextPath属性来找到你的war包或者war目录,比如这样一个xml文件:

    <Configure class="org.eclipse.jetty.webapp.WebAppContext">

      <Set name="contextPath">/mycontext</Set>

      <Set name="war">/home/wilsonp/myapp/myapp.war</Set>

    </Configure>

jetty会解析该xml文件,然后自动搜索到myapp.war文件,并定义其contextPath为/mycontext,启动之后就可以直接输入http://localhost:8080/mycontext/就能访问到应用了。

    其中WebAppContext中还有其他的属性:

    extractWAR:

    <Configure class="org.eclipse.jetty.webapp.WebAppContext">

      <Set name="contextPath">/mycontext</Set>

      <Set name="war">/home/wilsonp/myapp/myapp.war</Set>

      <Set name="extractWAR">false</Set>

    </Configure>

    通过以上设置,可以在部署myapp.war的时候不用展开该war文件。

    还记得在web.xml文件中可以设置应用初始化参数吧?其实也可以在这里进行设置,如下设置,

    <Configure class="org.eclipse.jetty.webapp.WebAppContext">

      <Set name="contextPath">/mycontext</Set>

      <Set name="war">/home/wilsonp/myapp/myapp.war</Set>

      <Set name="extractWAR">false</Set>

      <Get name="ServletContext">

         <Call name="setInitParameter">

             <Arg>myapp.config</Arg>

             <Arg>/home/wilsonp/myapp/config/app-config.xml</Arg>

         </Call>

      </Get>

    </Configure>

    可以在启动jetty的时候设置ServletContext参数,参数可以是一个xml文件,jetty会自动解析,但要注意一点,jetty在解析了部署描述符文件之后才会去解析web.xml,这时候如果web.xml中也有和app-config.xml中同名的参数的话会将其覆盖。

     overrideDescriptor:

     看如下配置:  

    <Configure class="org.eclipse.jetty.webapp.WebAppContext">

      <Set name="contextPath">/mycontext</Set>

      <Set name="war">/home/wilsonp/myapp/myapp.war</Set>

      <Set name="extractWAR">false</Set>

      <Get name="ServletContext">

         <Call name="setInitParameter">

             <Arg>myapp.config</Arg>

             <Arg>/home/wilsonp/myapp/config/app-config.xml</Arg>

         </Call>

      </Get>

      <Set name="overrideDescriptor">/home/wilsonp/myapp/config/overlay-web.xml</Set>

    </Configure>

    jetty解析web.xml文件之后会解析overlay-web.xml文件,就是说,可以在这个文件中覆盖web.xml中的属性,或者增加一些额外的属性,免得web.xml文件被改来改去的,麻烦,有了这个属性就省事了.

   jetty还可以配置jndi数据源,自己去看看吧!

(3)第二种方式是放置war包,其实可以放置满足servlet 规范的任意目录都可以

(4)还有最后一种就是在jetty9系列之jetty.home和jetty.base中说的jetty.base的方式

没了,我知道的就这几种方式,其实我一直使用的是第二种方式,简单方便,还容易修改

 

以上是关于jetty;linux 目录结构的主要内容,如果未能解决你的问题,请参考以下文章

jetty eclipse插件安装方式安装后,目录位置在哪儿

Jetty9 使用

linux怎么查看目录结构

在 Jetty 中通过默认 servlet 提供静态资源

Linux下的目录结构

Linux下的目录结构