`
jackyhongvip
  • 浏览: 154951 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

jetty_start.jar

 
阅读更多

1.概述

本文主要分析下jetty的start.jar中的jar包加载顺序和一些简单逻辑,由于没有下到start.jar包的源码,用反编译的方式搞的,代码可能有些地方不一定准确。

2.分析

1.main方法

main方法非常简单,基本就这一句:

1
Main main = new Main().parseCommandLine(args);
2. public void parseCommandLine(String[] args)

该函数主要完成解析命令行参数的功能:

1.首先遍历所有的传入参数,并把他们加入到arguments这个ArrayList中。如果指定了–ini=,则吧ini指定文件中的所有参数也加入到
arguments,如果是–config=,则设置 this._startConfig,最后如果传入参数中没有 –ini=或者–ini,就是用默认的ini,并把参数加入到arguments。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
       List arguments = new ArrayList();
       for (String arg1 : args)
       {
         if ((arg1.startsWith("--ini=")) || (arg1.equals("--ini")))
         {
             arguments.addAll(loadStartIni(arg1.substring(6)));
         }
         else if (arg1.startsWith("--config="))
         {
           this._startConfig = arg1.substring(9);
         }
         else
         {
           arguments.add(arg1);
         }
       }
       if (!(ini)){ arguments.addAll(0, loadStartIni(null));}

2.遍历arguments并一一解析处理,主要处理的参数有这些:

一些常见参数,类似–help,–stop等的处理

  • -daemon的处理,控制启动日志打印
  • -D…的参数,设置到System.properties中
  • - 的参数,设置为jvm参数
  • 类似a=b的参数,设置到this._config中
3.调用start(xmls);

public void start(List xmls) 主要完成这几件事情:

1.startMonitor();
2.List configuredXmls = loadConfig(xmls);
3.configuredXmls = resolveXmlConfigs(configuredXmls);//主要是确定所有xml的位置,包括文件夹转化为一个个的xml路径
4.mainClass = System.getProperty(“main.class”); invokeMain(cl, classname, configuredXmls);

其中loadConfig(xmls);和invokeMain(cl, classname, configuredXmls);是主要逻辑,loadConfig(xmls);主要是处理定义好的classpath和xml文件的处理顺序等,逻辑委托给org.eclipse.jetty.start.Config类来实现,部分代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 private InputStream getConfigStream() throws FileNotFoundException
   {
     String config = this._startConfig;
     if ((config == null) || (config.length() == 0))
     {
       config = System.getProperty("START", "org/eclipse/jetty/start/start.config");
     }
 
     Config.debug("config=" + config);
 
     InputStream cfgstream = super.getClass().getClassLoader().getResourceAsStream(config);
 
     if (cfgstream == null)
     {
       cfgstream = new FileInputStream(config);
     }
 
     return cfgstream;
   }

可以看到,如果我们自定义了start文件,就使用自定义的,否则使用start.jar中自带的,这个文件的主要功能是什么的,文档说:This file controls what file are to be put on classpath or command line.截取一小段示例一下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# add a property defined classpath
${path}.path                                     property path
 
# add a property defined library directory
${lib}/**                                        exists ${lib}
 
# Try different settings of jetty.home until the start.jar is found.
jetty.home=.                                     ! exists $(jetty.home)/start.jar 
jetty.home=..                                    ! exists $(jetty.home)/start.jar 
jetty.home=jetty-distribution/src/main/resources     ! exists $(jetty.home)/start.jar 
jetty.home=../jetty-distribution/src/main/resources  ! exists $(jetty.home)/start.jar 
jetty.home=.                                     ! exists $(jetty.home)/start.jar
jetty.home/=$(jetty.home)                        exists $(jetty.home)/start.jar
 
# The main class to run
org.eclipse.jetty.xml.XmlConfiguration.class
${start.class}.class                             property start.class
 
# The default configuration files
$(jetty.home)/etc/jetty.xml                      nargs == 0
./jetty-server/src/main/config/etc/jetty.xml     nargs == 0 AND ! exists $(jetty.home)/etc/jetty.xml
 
# Default OPTIONS if not specified on the command line
OPTIONS~=default,*                               ! property OPTIONS
 
# Add a resources directory if it is there
[All,resources,default]
$(jetty.home)/resources/
 
# Add jetty modules
[*]
$(jetty.home)/lib/jetty-util-$(version).jar                                             ! available org.eclipse.jetty.util.StringUtil
$(jetty.home)/lib/jetty-io-$(version).jar

可以看到它主要定义了一些classpath的路径等信息,解析过程比较复杂,在此不详述,有兴趣可以自己了解。这里举一个例子,比如我们在启动参数中定义了-lib=D:/mylib/

这个classpath就会被加入到java.class.path中,甚至比jetty的server等类还靠前,这样我们就可以覆盖或者替换jetty的类,达到一些特殊的目的。

完成一系列的预处理之后,就该真正的启动server了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    String mainClass = System.getProperty("jetty.server");
       if (mainClass != null)
       {
         classname = mainClass;
       }
 
       mainClass = System.getProperty("main.class");
       if (mainClass != null)
       {
         classname = mainClass;
       }
 
       Config.debug("main.class=" + classname);
 
       invokeMain(cl, classname, configuredXmls);

invokeMain(cl, classname, configuredXmls);这个方法就是关键的启动方法了,这里默认的main.class=org.eclipse.jetty.xml.XmlConfiguration,其主要逻辑如是:

先初始化properties文件或者解析xml文件,在解析的过程中可能会通过反射机制初始化一些类。包括server类等;然后对于生成的类,如果是继承了lifecycle的,全部启动,从而完成容器的启动,主要代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
                    // For all arguments, load properties or parse XMLs 
                    XmlConfiguration last = null;
                    Object[] obj = new Object[args.length];
                    for ( int i = 0; i  0 )
                                configuration.setProperties( properties );
                            obj[i] = configuration.configure();
                            last = configuration;
                        }
                    }
 
                    // For all objects created by XmlConfigurations, start them if they are lifecycles.
                    for ( int i = 0; i

通过debug级别的log可以看到,最先解析的是parsing: sid=file:/D:/learn/jetty7/etc/jetty.xml,其实现的逻辑和以下这段代码类似:

1
2
3
4
5
        Server server = new Server(8080);
        WebAppContext webapp = new WebAppContext();
        webapp.setContextPath("/");
        server.setHandler(webapp);
        server.start();

然后还有自定义的一些,比如jetty-deploy.xml等,整个初始化的过程就完成了。其实这里jetty也实现了一个简单的依赖注入的功能。

4. 总结:
start.jar 主要干了这几件事情:
1.解析命令行参数。
2.定位资源,根据参数和配置文件决定classpath和xmls的位置等。
3.反射调用启动server,并根据xml配置实现相关的依赖注入的功能

分享到:
评论

相关推荐

    启动jetty的start.jar

    启动jetty的start.jar,此文件所在目录下增加lib,etc,context文件夹,lib下增加jetty的主jar包和jetty的util包。在etc下增加jetty的两个配置文件jetty.xml和webdefault.xml。在context下增加test.xml

    jetty start 9.2.13 项目所需要的完整jar包,免费。jetty启动调试

    jetty start 9.2.13 项目所需要的完整jar包,免费。jetty启动调试

    Jetty嵌入项目代码中示例

    Jetty嵌入项目代码中示例,现我有一示例项目 e:/workspace/web-demo(称为project_home)...把${jetty_home}/start.jar复制到${project_home}/jetty目录下。 接下来在${project_home}/jetty/contexts目录下加一个文件。

    jetty-distribution-9.4.0.v20161208.zip

    * start.jar is jetty7主程序 * VERSION.txt * webapps应用路径,发布的引用基本都放这里 其中比较重要的目录是:etc、contexts、webapps 。个人认为可以类比 tomcat的conf、conf\Catalina\localhost、webapps目录...

    jetty8.0.4

    轻量级web server,纯java, etc下可修改配置文件jetty.xml(端口等),使用java -jar start.jar启动

    jetty-7.5 资源包

    jetty 服务器软件,一个轻量级的Java Servlet 容器。使用时解压运行Start.jar 即可。

    jetty的四个包

    jetty所需的四个基本包,包含jetty-6.1.8.jar jetty-util-6.1.8 servlet-apt-2.5-6.1.8.jar start-6.1.8.jar

    jetty嵌入式web容器jar包

    jetty嵌入式web容器jar包 示例: public static void main(String[] args) { // 服务器的监听端口 Server server = new Server(6666); // 关联一个已经存在的上下文 WebAppContext context = new WebAppContext...

    jetty-6.1.9 jspweb 服务器

    } } 需要的jar包: commons-logging.jar javax.servlet.jar org.mortbay.jetty.jar org.mortbay.jmx.jar 扩展阅读: 1.http://www.cnblogs.com/eafy/archive/2007/10/24/906792.html 2....

    camunda-bpm-jetty:社区扩展,以在Eclipse Jetty 9.x +上支持Shared Process Engine

    Camunda BPM扩展-码头 这个社区扩展允许Camunda BPM引擎...用法export JETTY_HOME=/opt/jetty-9.1.3.v20140225/ mkdir /tmp/democd /tmp/demojava -jar $JETTY_HOME/start.jar --add-to-startd=http,spdy,jmx,deploy

    Linux上Solr的启动方式

     (2)使用内置的Jetty来启动Solr服务器只需要在example目录下,执行start.jar程序即可,我们可以直接执行命令:java –jar start.jar。  (3)当服务启动后,默认发布在8983端口,所以可以访问该端口来访问Solr服务,...

    Jetty中文手册

    Jetty Start.jar 配置Jetty 如何设置上下文(Context Path) 如何知道使用了那些jar包 如何配置SSL 如何使用非root用户监听80端口 如何配置连接器(Connectors) 如何配置虚拟主机(Virtual Hosts) 如何配置会话ID...

    jettyREST:将 Jetty + Jersey + Servlet 3.0 + JAX-RS 用于 RESTful web 服务的示例

    码头休息区 jettyREST 是关于如何使用 Jetty + JAX-RS + Jersey + Servlet 3.0 作为 RESTful API 的技术堆栈的示例。 它非常基础,仅包含一...java -jar start.jar 如果在本地主机上运行,​​您可以在此处查看示例:

    chatable-client-web:可聊天的 Web 客户端

    可聊天的网络客户端 官方 Chatable 网络聊天客户端 指示 1.编译 mvn gwt:compile ...2. 整合 创建一个 Jetty 实例 或者通过wget ... java -jar start.jar jetty.port=<Your>

    solr-jetty:Jetty应用程序用于部署我们的Solr服务

    码头用于部署Solr的Jetty应用程序。 默认情况下,不包含任何核心。 必须将它们添加到配置中...安装下载并运行: java -jar start.jar从以下位置查看应用程序: http://localhost:8985/solr/版本号索尔4.10.4 码头8.1.16

    servlet-web-framework-demo:基于servlet的最小演示Web框架

    基于Servlet的最小Web框架。 例如,请参见TestController和routes 。...在码头上部署下载码头(v9.2) 将.war放到webapps路径java -jar start.jar 定位: http://localhost:8080/you-war-file-name

    ocean:一个简单的论坛项目

    使用ocean.sh -start启动项目 使用ocean.sh -stop结束项目 build.xml用于build ocean.jar jetty.xml是运行项目的web配置文件 logback.xml为日志的配置文件 ocean.properties配置了一些项目需要的属性

    websocket-example:一个简单的示例,显示如何使用websocket

    如何运行该程序?...java -jar start.jar 配置nginx mkdir -p / tmp / websocket cp index.html / tmp / websocket 更改ws.conf的根目录。 使用'include'包含ws.conf。 重新启动nginx。 访问

    WebGUI:网页图形用户界面骰子

    骰子如何运行: 下载战争:Dice/artifacts/Dice.war 下载服务器: : 提取码头将 Dice.war 移动到 {jetty base}\webapps 下载安装RabbitMQ服务器: : 运行RabbitMQ服务器运行 start.jar: java -jar start.jar 转到 ==...

    spring-boot-reference.pdf

    10.2.6. Quick-start Spring CLI Example 10.3. Upgrading from an Earlier Version of Spring Boot 11. Developing Your First Spring Boot Application 11.1. Creating the POM 11.2. Adding Classpath ...

Global site tag (gtag.js) - Google Analytics