`
jackyhongvip
  • 浏览: 159679 次
  • 性别: 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版本9.2.13,这是一个稳定且常用的版本,提供了完整的jar包,特别适用于启动和调试项目。 在提供的文件列表中,包含了以下关键组件: 1. **jetty-server-9.2.13.v20150730.jar**:这是...

    jetty-distribution-9.4.36.v20210114.zip

    通过执行`java -jar start.jar`命令,你可以启动Jetty并应用在`start.ini`中定义的配置。 3. **LICENSE-EPLv10-ASLv20.html** 和 **NOTICE.html**: 这些文件包含了Jetty的许可协议,Eclipse Public License v1.0 ...

    jetty各个版本下载

    Jetty的配置相对简单,主要通过修改`start.ini`或`jetty.xml`文件来定制服务器行为。你可以设置端口、线程池大小、日志配置等。此外,Jetty还支持热部署,这意味着你可以在不重启服务器的情况下更新Web应用。 6. *...

    jetty axis2.war

    4. 启动Jetty服务器,可以通过执行"java -jar start.jar"命令来启动。 5. 当Jetty服务器启动后,"axis2.war"会被自动部署,此时你可以通过访问"http://localhost:8080/axis2/"(默认端口8080,根据实际情况可能不同...

    jetty的四个包

    java -jar start.jar jetty.webapp.context=/myapp path/to/myapp.war ``` 这行命令会启动Jetty服务器,并将`myapp.war`部署为名为`/myapp`的Web应用程序。 总结来说,这些Jetty的基本包提供了运行Servlet应用的...

    Jetty 9.4.6 jar包

    2. **启动与停止**: 使用`java -jar start.jar`命令可以启动Jetty服务器,`start.jar`是Jetty的启动脚本,它会自动加载配置文件。停止Jetty通常通过发送一个特定的信号或者执行`java -jar stop.jar --stop-port=8080...

    Jetty嵌入项目代码中示例

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

    jetty6.1文件包 && 使用教程

    主要的目录包括"start.jar",这是启动Jetty服务器的入口,以及"webapps"目录,用于存放Web应用程序。 在运行Jetty之前,你需要配置服务器。这可以通过修改"etc/jetty.xml"配置文件完成,其中包含了服务器的端口设置...

    jetty-4.2.24

    3. **启动Jetty**:通过执行Jetty提供的启动脚本(如start.jar)启动服务器。 4. **使用API**:对于嵌入式使用,可以通过Java代码直接创建并管理Jetty服务器,添加Servlet、过滤器和监听器。 5. **监控和管理**:...

    jetty-distribution-9.4.12.v20180830

    - **启动与停止**:执行解压目录下的bin/start.jar脚本启动Jetty,停止时运行bin/jetty.sh stop命令。 - **部署应用**:将WAR文件放入webapps目录下,Jetty会自动检测并部署应用。 - **配置**:可以通过修改conf...

    Jetty权威指南.pdf

    - **2.3.3 start.jar深入探讨**:`start.jar`是一个特殊的Jar包,它包含了启动Jetty所需的所有依赖库,并且内置了一些默认的配置文件,便于快速部署。 **2.4 我们可以学到什么** 通过实践Jetty的安装和启动过程,...

    apache-solr-3.5.0.jar

    3. **启动Solr**:使用Java运行`start.jar`文件(位于解压后的根目录),这将启动内置的Jetty服务器,使Solr服务运行起来。命令通常是`java -jar start.jar`。 4. **创建索引**:利用SolrJ库,你可以编写Java代码来...

    osgi-jetty-9.3.10环境配置-注册Servlet工程示例

    public void start(BundleContext context) throws Exception { OSGiWebAppContext webApp = new OSGiWebAppContext(); webApp.setContextPath("/"); webApp.setWar("path/to/your/webapp"); webApp.addServlet...

    jetty-distribution-9.4.0.v20161208.zip

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

    jetty的安装与使用

    ./jetty.sh start 或者 java -jar start.jar ``` 这将启动Jetty服务器,你可以在控制台看到类似"Server started at http://localhost:8080/"的信息。 **4. 部署Web应用** Jetty默认会在`$JETTY_HOME/webapps`目录...

    Eclipse+_maven_+_jetty_开发web

    - 配置启动:可以通过命令行使用java -jar start.jar命令来启动Jetty服务器。在Eclipse的Servers视图中也可以添加和配置Jetty服务器实例,以便于在开发时直接通过Eclipse启动和管理服务器。 3. Jetty for Eclipse...

    jetty 8.1.15.v20140411

    1. **bin目录**:包含了启动和停止Jetty服务器的脚本,如start.jar和jetty.sh/bat,便于用户操作。 2. **lib目录**:存放了Jetty运行所需的JAR库,包括Servlet API和其他相关依赖。 3. **modules目录**:包含Jetty的...

    安装jetty相关指南

    在Windows上,运行`start.jar`(可能需要通过`java -jar start.jar`)。这会启动Jetty服务器并监听默认端口8080。 **五、部署Web应用** 5. Jetty允许通过两种方式部署Web应用:放置WAR文件或使用webapps目录下的...

    jetty安装的JAR(其他相关的jetty axis2的jar请看此博客相关文档)

    1. **bin** 目录:包含了启动和管理Jetty服务器的脚本,如`start.jar`和各种操作系统平台的启动脚本(例如,对于Unix-like系统,有`jetty.sh`)。 2. **lib** 目录:存放了Jetty自身和其他依赖的JAR文件。这些库...

Global site tag (gtag.js) - Google Analytics