jetty 中怎么jetty设置堆大小root app

当前位置: >
> Jetty跟Eclipse整合
Jetty跟Eclipse整合
tangzudong & at
Jetty和Eclipse整合
  版本信息
  Jetty版本:jetty-distribution-7.4.2.v
  Eclipse版本:Version: 3.5.1.R35x_vgEeG1_FthkNDSP2odXdThaOu9GFDPn83DGB7
  整合步骤
  可以直接参考文章:
  简单描述下:
  一、创建JettyServer工程
  1.将下载后的jetty-distribution-7.4.2.v文件夹放到一个Eclipse工程中,如下图所示:
  2.更改JettyServer的Java Build Path,将start.jar加入到Libraries中。
  二、创建Web工程项目
  Web工程需要有一个该Web工程的root文件夹,如下图所示,其中root文件夹就是WebContent。
  三、配置整合
  1.在WebServer下的contexts文件夹中创建一个myapp.xml,具体文件格式可以参考自带的test.xml,大致内容如下:
  &Configure class="org.eclipse.jetty.webapp.WebAppContext"&
&Set name="contextPath"&/app&/Set&
&Set name="war"&&SystemProperty name="jetty.home" default="."/&/../JettyWeb/WebContent&/Set&
&Set name="extractWAR"&true&/Set&
&Set name="copyWebDir"&false&/Set&
&Set name="defaultsDescriptor"&&SystemProperty name="jetty.home" default="."/&/etc/webdefault.xml&/Set&
&/Configure&
  其中"/../JettyWeb/WebContent"特别要注意,第一个斜杠一定不要忘记,不然在eclipse中会出现
  java.net.MalformedURLException: unknown protocol:的异常,这个异常一般情况下不奇怪,一定是自己的路径写错了,而不是其它问题。如果平时也遇到这样的问题,首先需要考虑以下可能:
  (1)路径写错了
  (2)路径中含有中文字符、空格符之类的
  四、启动Jetty Server
  在Debug Configurations中(如果是Run,配置相同),设置Project为JettyServer, Main Class为org.eclipse.jetty.start.Main,如下图所示:
  五、调试Web应用程序
  现在可以直接在Web程序(这里是JettyWeb)中设置断点调试了,调试的时候需要关联源代码,也就是JettyWeb就可以了。也可以直接在Debug Configurations里面设置Source,将JettyWeb的src目录加入即可。
本问题标题:
本问题地址:
温馨提示:本问答中心的任何言论仅代表发言者个人的观点,与希赛网立场无关。请对您的言论负责,遵守中华人民共和国有关法律、法规。如果您的言论违反希赛网问答中心的规则,将会被删除。
暂无合适的专家
&&&&&&&&&&&&&&&
希赛网 版权所有 & &&&&湘教QS2-164&&增值电信业务经营许可证湘B2-这是一个JavaProject
首先是待纳入Jetty管理的LoginServlet.java
package com.jadyer.
import java.io.IOE
import java.io.PrintW
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
public class LoginServlet extends HttpServlet {
private static final long serialVersionUID = 6107171L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("收到请求参数[" + request.getParameter("username") + "]");
response.setContentType("text/ charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("&h2&这是我的嵌入式Jetty测试结果&/h2&");
out.flush();
out.close();
下面这个也是待纳入Jetty管理的UserServlet.java
package com.jadyer.
import java.io.IOE
import java.io.PrintW
import javax.servlet.ServletE
import javax.servlet.http.HttpS
import javax.servlet.http.HttpServletR
import javax.servlet.http.HttpServletR
public class UserServlet extends HttpServlet {
private static final long serialVersionUID = 6107171L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("收到请求参数[" + request.getParameter("username") + "]");
response.setContentType("text/ charset=UTF-8");
PrintWriter out = response.getWriter();
out.print("&h2&这是我的嵌入式Jetty测试结果--&用户访问Servlet成功&/h2&");
out.flush();
out.close();
最后是自己编写的Jetty启动类MyServer.java(内含Jetty嵌入式的简单用法)
package com.jadyer.
import java.util.HashM
import java.util.M
import javax.servlet.S
import org.eclipse.jetty.server.S
import org.eclipse.jetty.servlet.ServletContextH
import org.eclipse.jetty.webapp.WebAppC
import com.jadyer.servlet.LoginS
import com.jadyer.servlet.UserS
* @see --------------------------------------------------------------------------------------------------------------
* @see Jetty简介
* @see Jetty是一个嵌入式的Web服务器
* @see Jetty官网:http://www.eclipse.org/jetty/
* @see Jetty下载:http://download.eclipse.org/jetty/
* @see --------------------------------------------------------------------------------------------------------------
* @see Jetty与Tomcat比较(取自网络)
* @see Jetty的架构要比Tomcat简单一些,它是基于Handler来实现的,它可以通过Handler来进行扩展
* @see Tomcat的架构是基于容器设计的,扩展Tomcat时需要了解Tomcat的整体设计结果,故不易扩展
* @see --------------------------------------------------------------------------------------------------------------
* @see Jetty使用
* @see 0)版本选择:由于Jetty9需要JDK7的支持,所以我们这里使用jetty-distribution-8.1.10.v.zip
* @see 1)修改端口:修改\\JETTY_HOME\\etc\\jetty.xml第40行default="8080"即可
* @see 2)非嵌入式的项目发布(有两种方式)
非嵌入式的启动方式为命令行下执行该命令--&D:\Develop\jetty-distribution-8.1.10.v&java -jar start.jar
第一种:项目打成war包放到\\JETTY_HOME\\webapps\\下即可,访问地址为http://127.0.0.1:8080/warName(war名字大小写严格相同)
第二种:类似于Tomcat的&Context path="" docBase=""&的方式,即在\\JETTY_HOME\\contexts\\目录下新增一个名字随意的xml文件
文件格式与该目录下的javadoc.xml相同,其中主要修改以下两处
&Set name="contextPath"&/testBbb&/Set&
&Set name="resourceBase"&F:/Tool/Code/JavaSE/loginManager/WebRoot&/Set&
* @see 3)嵌入式的项目发布
也就是把Jetty提供的jar加入到项目中(可以是Java项目或Web项目),然后编写通过一个main()启动Jetty,所用到的jar如下
JETTY_HOME中的lib目录,和lib下的jsp目录,这俩目录中的jar加入到项目中即可(若不涉及jsp页面,就不需要jsp目录下的jar了)
具体写法详见这里的startForServlet()和startForWebApp()方法
* @see --------------------------------------------------------------------------------------------------------------
* @create Jul 5, :24 PM
* @author 玄玉&http://blog.csdn.net/jadyer&
public class MyServer {
public static void main(String[] args) {
Map&Class&? extends Servlet&, String& servletMap = new HashMap&Class&? extends Servlet&, String&();
servletMap.put(UserServlet.class, "/user");
servletMap.put(LoginServlet.class, "/login");
startForServlet(8089, "/testJettyDemo", servletMap);
startForWebApp(8089, "/gbook", "F:/Tool/Code/JavaSE/guestbook/WebRoot");
* 针对Servlet
* @see 通过servletMap参数可以使得该方法直接同时发布多个Servlet
* @param port
访问服务器的端口
* @param contextPath 访问服务器的地址
* @param servletMap
发布的Servlet(这是一个Map,键为Servlet的class对象,值为映射url-pattern)
private static void startForServlet(int port, String contextPath, Map&Class&? extends Servlet&, String& servletMap){
//绑定端口
Server server = new Server(port);
//可以使用ServletContextHandler处理Servlet
ServletContextHandler context = new ServletContextHandler();
//添加Servlet并指定映射url-pattern
for(Map.Entry&Class&? extends Servlet&, String& servletEntry : servletMap.entrySet()){
context.addServlet(servletEntry.getKey(), servletEntry.getValue());
//此时访问路径就是http://127.0.0.1:port/contextPath/urlPattern
context.setContextPath(contextPath);
//绑定Handler
server.setHandler(context);
//启动服务
server.start();
} catch (Exception e) {
System.out.println("启动Jetty时发生异常,堆栈轨迹如下");
e.printStackTrace();
if(server.isStarted()){
System.out.println("Servlet服务启动成功");
* 针对一个Web应用
* @see 注意resourceBase参数指向的应用所依赖的jar必须全部存放在其WebRoot\WEB-INF\lib目录中
* @see 否则应用启动后,访问时会由于在lib中找不到jar而报告java.lang.ClassNotFoundException
* @param port
访问服务器的端口
* @param contextPath
访问服务器的地址
* @param resourceBase Web应用的目录(需指向到WebRoot目录下)
private static void startForWebApp(int port, String contextPath, String resourceBase){
Server server = new Server(port);
//使用WebAppContext时就必须设置resourceBase
WebAppContext context = new WebAppContext();
//此时访问路径就是http://127.0.0.1:port/contextPath
context.setContextPath(contextPath);
context.setResourceBase(resourceBase);
server.setHandler(context);
server.start();
} catch (Exception e) {
System.out.println("启动Jetty时发生异常,堆栈轨迹如下");
e.printStackTrace();
if(server.isStarted()){
System.out.println("Web服务启动成功");
阅读(...) 评论()jetty 中如何设置root app - 知行天下 - ITeye技术网站
博客分类:
jetty作为一个web容器,部署时只需要将部署包扔到 $JETTY_HOME/webapp目录下即可!
例如工程 test.war ,在启动jetty后的访问路径就是 http://localhost:8080/test ,若是我们期望访问 http://localhost:8080/ 即是访问test工程的呢?有两种办法可以解决。
1.直接将 test.war 改名为root.war 。
这个是最简单的做法,也是一般web容器都通用的做法,放到tomcat也是这种做法。
2.修改contexts目录下文件。
这个做法稍微有点麻烦,是通过设置 contexts来达到目的,不期望改变原来的配置文件,所以我们copy配置文件出来。
step1 准备工作
mkdir -p /home/inter12/jetty/webapp/virtual
mkdir -p /home/inter12/jetty/config
mkdir -p /home/inter12/jetty/config/contexts
cp $JETTY_HOME/etc/jetty.xml
/home/inter12/jetty/config/
step2 修改配置
/home/inter12/jetty/config/jetty.xml
修改其中的
&Call name="addLifeCycle"&
&New class="org.mortbay.jetty.deployer.ContextDeployer"&
&Set name="contexts"&&Ref id="Contexts"/&&/Set&
&!----------------- 将contexts路径设置为我们新的 --------------------&
&Set name="configurationDir"&/home/inter12/jetty/config/contexts&/Set&
&Set name="scanInterval"&5&/Set&
&Call name="addLifeCycle"&
&New class="org.mortbay.jetty.deployer.WebAppDeployer"&
&Set name="contexts"&&Ref id="Contexts"/&&/Set&
&!--------------- 设置webapp 目录
指定到一个虚拟的webapp 。---------------&
&Set name="webAppDir"&/home/inter12/jetty/webapp/virtual&/Set&
&Set name="parentLoaderPriority"&false&/Set&
&Set name="extract"&true&/Set&
&Set name="allowDuplicates"&false&/Set&
&Set name="defaultsDescriptor"&&SystemProperty name="jetty.home" default="."/&/etc/webdefault.xml&/Set&
cd /home/inter12/jetty/config/contexts
新建一个 test.xml(这个名字可以是任意的)
&?xml version="1.0"
encoding="ISO-8859-1"?&
&!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN" "http://jetty.mortbay.org/configure.dtd"&
&Configure class="org.mortbay.jetty.webapp.WebAppContext"&
&!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --&
&!-- Required minimal context configuration :
+ contextPath
+ war OR resourceBase
&!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --&
&Set name="contextPath"&/&/Set&
&!-- 这里必须加上war这个结尾 - - - - - - - - - - - - - - - - - - - - --&
&Set name="war"&/home/inter12/jetty/webapp/test.war&/Set&
&!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --&
&!-- Optional context configuration
&!-- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - --&
&Set name="extractWAR"&true&/Set&
&Set name="copyWebDir"&false&/Set&
&/Configure&
好了,到这里就已经基本结束了。
cd $JETTY_HOME
java -jar start.jar /home/inter12/jetty/config/jetty.xml
那么访问 http://localhost:8080/test
http://localhost:8080
若是通过contexts来配置 / 访问的话,那么war就不要放在webapp目录下,jetty会加载两边,若是配置了log4j的话,就会出现一下错误,切记!!!
Choose unique values for the 'webAppRootKey' context-param in your web.xml files!
浏览: 160788 次
来自: 杭州
30多条mysql数据库优化方法,千万级数据库记录查询轻松解决 ...
直接改成root.war,根路径能访问,项目路径也能访问,赞 ...
翻出来,再看一次!
inter12 写道Shen.Yiyang 写道我说的不是NI ...
Shen.Yiyang 写道我说的不是NIO和BIO的区别,而 ...我启动jetty,报下面异常:
10:34:22.799:INFO::jetty-7.2.2.v
10:34:28.665:WARN::FAILED org.eclipse.jetty.security.ConstraintSecurityHandler@17ec9f7: java.lang.IllegalStateException: No LoginService for org.eclipse.jetty.security.authentication.BasicAuthenticator@3b1f38 in org.eclipse.jetty.security.ConstraintSecurityHandler@17ec9f7
10:34:28.665:WARN::FAILED org.eclipse.jetty.server.session.SessionHandler@fd918a: java.lang.IllegalStateException: No LoginService for org.eclipse.jetty.security.authentication.BasicAuthenticator@3b1f38 in org.eclipse.jetty.security.ConstraintSecurityHandler@17ec9f7
10:34:28.665:WARN::Failed startup of context o.e.j.w.WebAppContext{/,file:/E:/workspace/sms/WebRoot/}
java.lang.IllegalStateException: No LoginService for org.eclipse.jetty.security.authentication.BasicAuthenticator@3b1f38 in org.eclipse.jetty.security.ConstraintSecurityHandler@17ec9f7
at org.eclipse.jetty.security.authentication.LoginAuthenticator.setConfiguration(LoginAuthenticator.java:45)
at org.eclipse.jetty.security.SecurityHandler.doStart(SecurityHandler.java:335)
at org.eclipse.jetty.security.ConstraintSecurityHandler.doStart(ConstraintSecurityHandler.java:228)
at org.eclipse.ponent.AbstractLifeCycle.start(AbstractLifeCycle.java:55)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:93)
at org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:97)
at org.eclipse.jetty.server.session.SessionHandler.doStart(SessionHandler.java:114)
at org.eclipse.ponent.AbstractLifeCycle.start(AbstractLifeCycle.java:55)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:93)
at org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:97)
at org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:630)
at org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:228)
at org.eclipse.jetty.webapp.WebAppContext.startContext(WebAppContext.java:1181)
at org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:584)
at org.eclipse.jetty.webapp.WebAppContext.doStart(WebAppContext.java:496)
at org.eclipse.ponent.AbstractLifeCycle.start(AbstractLifeCycle.java:55)
at org.eclipse.jetty.server.handler.HandlerWrapper.doStart(HandlerWrapper.java:93)
at org.eclipse.jetty.server.Server.doStart(Server.java:243)
at org.eclipse.ponent.AbstractLifeCycle.start(AbstractLifeCycle.java:55)
at util.OneWebAppUnassembled.main(OneWebAppUnassembled.java:21)
结果我将下面这两行代码加上在执行便没有问题了:
&&&&&& HashLoginService dummyLoginService = new HashLoginService("TEST-SECURITY-REALM");&&
&&&&& webAppCtx.getSecurityHandler().setLoginService(dummyLoginService);
有些web应用在我当前jetty下是可以正常运行的,但我部署另一个web应用就会出现上面的异常,我现在没搞清楚是什么原因导致的,还有这两句代码都做了什么事情实现了什么功能,妄解答!谢谢
问题补充:对于一个web容器,为什么会出现有些web应用可以正常运行,有些则不可以,对于jetty嵌入到应用中,需要实现哪些方面功能,才能得以支持所有的web应用!
问题补充:Wind_ZhongGang 写道&?xml version="1.0"& encoding="ISO-8859-1"?&
&!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"&
&Configure class="org.eclipse.jetty.webapp.WebAppContext"&
& &Set name="contextPath"&/template&/Set&
& &Set name="war"&&SystemProperty name="jetty.home" default="."/&/webapps/Template.war&/Set&
& &Set name="extractWAR"&true&/Set&
& &Set name="copyWebDir"&false&/Set&
& &Set name="defaultsDescriptor"&&SystemProperty name="jetty.home" default="."/&/etc/webdefault.xml&/Set&
& &Get name="securityHandler"&
&&& &Set name="loginService"&
&&&&& &New class="org.eclipse.jetty.security.HashLoginService"&
&&& &Set name="name"&Test Realm&/Set&
&&& &Set name="config"&&SystemProperty name="jetty.home" default="."/&/etc/realm.properties&/Set&
&&&&& &/New&
&&& &/Set&
&&& &Set name="checkWelcomeFiles"&true&/Set&
& &/Get&
&/Configure&
不知道楼主是否对jetty安装文件下的context文件里的配置文件有所研究,如果想要在jetty中部署你的web应用程序,需要增加这样的配置文件,如果不想使用配置文件而想嵌入应用程序中,也应该实现配置文件中所需要的最少步骤。从配置文件中可以看出,在jetty中启动一个web应用程序是从WebAppContext类开始的,其中需要配置它的属性,如启动时的地址,启动时的war包的位置,还有就是配置securityHandler中的loginService。这些配置相应的也就能够体现在你的java程序中了。
谢谢兄台!我对jetty就研究了几天还不甚了解,一直在看些资料。如你所讲的话:Configure标签下这么的set子标签和属性,都要一一实现,应用程序中嵌入的jetty容器功能才全面的话这样的工作力度貌似还是很大的。
期待更多的答案!
问题补充:myali88 写道我刚才测试了一下,如果你在web.xml里增加了下面的配置,那么jetty启动的时候就会报No LoginService的错误:
&security-constraint&
&web-resource-collection&
&web-resource-name&A Protected Page&/web-resource-name&
&url-pattern&/*&/url-pattern&
&/web-resource-collection&
&auth-constraint&
&role-name&admin&/role-name&
&role-name&user&/role-name&
&role-name&moderator&/role-name&
&/auth-constraint&
&/security-constraint&
&login-config&
&auth-method&BASIC&/auth-method&
&realm-name&MyRealm&/realm-name&
&/login-config&
不知道你的web应用里面是否也有这些配置。
我的web.xml配置了&
&login-config&
&auth-method&BASIC&/auth-method&
&/login-config&
应该就是这个问题。
但是我想问问:嵌入到应用中的jetty容器,是不是在代码中需要对应的代码功能jetty.xml中的相应的配置内容的功能呢?那这么的属性应该如何完成呢?
问题补充:Wind_ZhongGang 写道并不像你想像中的那么大,主要使用的就是配置文件中提及的几个类,至于set get都是这些类中的方法而已,只要你设置了正确的属性,那么启动就没有问题。jetty本身就很小,想要使用配置文件或是在应用程序中编程实现都是很容易的事情。这还要取决于你的需求有多大。了解了配置文件中怎么启动的服务器,你就会相应了解在应用程序中应该怎么编程实现了。
非常感谢,好像兄台对Jetty比较了解。不知道有没有使用过JNDI和jetty绑定来开发,如果有的话,请将代码分享,小弟不才,妄指点一二!
问题补充:myali88 写道引用
但是我想问问:嵌入到应用中的jetty容器,是不是在代码中需要对应的代码功能jetty.xml中的相应的配置内容的功能呢?那这么的属性应该如何完成呢?
如果是嵌入式的可以直接在代码中增加:
HashUserRealm myrealm = new HashUserRealm("MyRealm",System.getProperty("jetty.home")+"/etc/realm.properties");
server.setUserRealms(new UserRealm[]{myrealm});
这个是jetty 6的写法,jetty 7的写法你上面已经有了。
如果是在jetty.xml里面配置的话,可以这样:
&Configure class="org.eclipse.jetty.webapp.WebAppContext"&
&Set name="contextPath"&/test&/Set&
&Set name="war"&&SystemProperty name="jetty.home" default="."/&/webapps/test&/Set&
&Get name="securityHandler"&
&Set name="loginService"&
&New class="org.eclipse.jetty.security.HashLoginService"&
&Set name="name"&Test Realm&/Set&
&Set name="config"&&SystemProperty name="jetty.home" default="."/&/etc/realm.properties&/Set&
&/Configure&
问题补充:我看web.xml中,
&& &login-config&
&&&&&&& &auth-method& BASIC | DIGEST | CLIENT-CERT|FORM
&&&&&&& &/auth-method&
&&& &/login-config&
BASIC,DIGEST ...四种安全认证类型。如果web.xml可能配置的是其中一种,测试都通过了。谢谢了!您知道嵌入的jetty的web容器(就是之前我写的代码),在启动运行或者关闭,日志可以写到我指定log文件中呢?就有如tomcat中生成到log文件夹的log文件,jetty有什么样的机制去做这些事情呢?再次感谢!您帮了我不少忙!
问题补充:myali88 写道
Server server = new Server(8080);
HandlerCollection collection = new HandlerCollection();
collection.addHandler(handler);
RequestLogHandler logHandler = new RequestLogHandler();
NCSARequestLog log = new NCSARequestLog();
log.setFilename("target/request.log");
log.setAppend(true);
logHandler.setRequestLog(log);
collection.addHandler(logHandler);
server.setHandler(collection);
server.start();
楼上的做法是对的,不过这样只能记录请求的日志,至于jetty服务器启动本身的日志输出,这个还是通过外部日志系统完成的,就如果我们webapp里面要输出日志,需要配置log4j一样,内置的jetty也是一个app,做法类似。
可不可以通过对etc/jetty-logging.xml用java代码来实现,便可实现犹如tomcat一样在log目录下生产相应的log文件呢?也就是说这是属于jetty web容器本身的log日志信息。
Jetty-logging.xml文件的内容如下:
&?xml version="1.0"?&&
&!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"&&
&!-- =============================================================== --&
&!-- Configure stderr and stdout to a Jetty rollover log file&&&&&&& --&
&!-- this configuration file should be used in combination with&&&&& --&
&!-- other configuration files.& e.g.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& --&
&!--&&& java -jar start.jar etc/jetty-logging.xml&&&&&&&&&&&&&&&&&&& --&
&!-- ======================================== --&
&Configure id="Server" class="org.eclipse.jetty.server.Server"&&
&&& &New id="ServerLog" class="java.io.PrintStream"&&
&&&&& &Arg&&
&&&&&&&& &New class="org.eclipse.jetty.util.RolloverFileOutputStream"&&
&&&&&&&& &Arg&&Property name="jetty.logs" default="/var/log/jetty"/&/yyyy_mm_dd.stderrout.log&/Arg&&
&&&&&&&&& &Arg type="boolean"&false&/Arg&&
&&&&&& &Arg type="int"&30&/Arg&&
&&&&&&&&& &Arg&&Call class="java.util.TimeZone" name="getTimeZone"&&Arg&GMT&/Arg&&/Call&&/Arg&&
&&&&&&&&& &Get id="ServerLogName" name="datedFilename"/&&
&&&&&&& &/New&&
&&&& &/Arg&&
&&& &/New&&
&&& &Call class="org.eclipse.jetty.util.log.Log" name="info"&&Arg&Redirecting stderr/stdout to &Ref id="ServerLogName"/&&/Arg&&/Call&&
&& &Call class="java.lang.System" name="setErr"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&&
&& &Call class="java.lang.System" name="setOut"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&&
&/Configure&
因为嵌入一个jetty web容器没有了xml配置文件,但是我想实现一个jetty web容器本身的log信息的生产和维护,目前还是比较没有思绪,待解!
问题补充:myali88 写道
&Configure id="Server" class="org.eclipse.jetty.server.Server"&
&New id="ServerLog" class="java.io.PrintStream"&
&New class="org.eclipse.jetty.util.RolloverFileOutputStream"&
&Arg&&Property name="jetty.logs" default="/var/log/jetty"/&/yyyy_mm_dd.stderrout.log&/Arg&
&Arg type="boolean"&false&/Arg&
&Arg type="int"&30&/Arg&
&Arg&&Call class="java.util.TimeZone" name="getTimeZone"&&Arg&GMT&/Arg&&/Call&&/Arg&
&Get id="ServerLogName" name="datedFilename"/&
&Call class="org.eclipse.jetty.util.log.Log" name="info"&&Arg&Redirecting stderr/stdout to &Ref id="ServerLogName"/&&/Arg&&/Call&
&Call class="java.lang.System" name="setErr"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&
&Call class="java.lang.System" name="setOut"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&
&/Configure&
你将这段配置,转成java代码的方式应该就可以了。比如上面的
&Configure id="Server" class="org.eclipse.jetty.server.Server"& 相当于new Server()
&New id="ServerLog" class="java.io.PrintStream"& 相当于new PrintStream,&Arg&部分就是构造函数的参数。
其他的都是类似,你可以这样把xml翻译成java代码。
谢谢myali88 和 Wind_ZhongGang你们两位的帮助,我正尝试着写这个!这样的交流让我学到很多东西。
采纳的答案
&Configure id="Server" class="org.eclipse.jetty.server.Server"&
&New id="ServerLog" class="java.io.PrintStream"&
&New class="org.eclipse.jetty.util.RolloverFileOutputStream"&
&Arg&&Property name="jetty.logs" default="/var/log/jetty"/&/yyyy_mm_dd.stderrout.log&/Arg&
&Arg type="boolean"&false&/Arg&
&Arg type="int"&30&/Arg&
&Arg&&Call class="java.util.TimeZone" name="getTimeZone"&&Arg&GMT&/Arg&&/Call&&/Arg&
&Get id="ServerLogName" name="datedFilename"/&
&Call class="org.eclipse.jetty.util.log.Log" name="info"&&Arg&Redirecting stderr/stdout to &Ref id="ServerLogName"/&&/Arg&&/Call&
&Call class="java.lang.System" name="setErr"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&
&Call class="java.lang.System" name="setOut"&&Arg&&Ref id="ServerLog"/&&/Arg&&/Call&
&/Configure&
你将这段配置,转成java代码的方式应该就可以了。比如上面的
&Configure id="Server" class="org.eclipse.jetty.server.Server"& 相当于new Server()
&New id="ServerLog" class="java.io.PrintStream"& 相当于new PrintStream,&Arg&部分就是构造函数的参数。
其他的都是类似,你可以这样把xml翻译成java代码。
正确,将配置文件中的信息转换成java代码。
Server server = new Server(8080);
HandlerCollection collection = new HandlerCollection();
collection.addHandler(handler);
RequestLogHandler logHandler = new RequestLogHandler();
NCSARequestLog log = new NCSARequestLog();
log.setFilename("target/request.log");
log.setAppend(true);
logHandler.setRequestLog(log);
collection.addHandler(logHandler);
server.setHandler(collection);
server.start();
楼上的做法是对的,不过这样只能记录请求的日志,至于jetty服务器启动本身的日志输出,这个还是通过外部日志系统完成的,就如果我们webapp里面要输出日志,需要配置log4j一样,内置的jetty也是一个app,做法类似。
&Set name="handler"&
&&& &New id="RequestLog" class="org.eclipse.jetty.server.handler.RequestLogHandler"&
&&&&& &Set name="requestLog"&
&New id="RequestLogImpl" class="org.eclipse.jetty.server.NCSARequestLog"&
& &Set name="filename"&&Property name="jetty.logs" default="./logs"/&/test-yyyy_mm_dd.request.log&/Set&
& &Set name="filenameDateFormat"&yyyy_MM_dd&/Set&
& &Set name="append"&true&/Set&
& &Set name="LogTimeZone"&GMT&/Set&
&/New&
&&&&& &/Set&
&&& &/New&
& &/Set&
在你的配置文件中添加这样的配置,或都以应用程序的形式实现
NCSARequestLog log=new NCSARequestLog();
log.setFilename();
log.setFilenameDateFormat();
log.setAppend();
log.setLogTimeZone();
RequestLogHandler logHandler=new RequestLogHandler();
logHandler.setRequestLog(log);
引用
但是我想问问:嵌入到应用中的jetty容器,是不是在代码中需要对应的代码功能jetty.xml中的相应的配置内容的功能呢?那这么的属性应该如何完成呢?
如果是嵌入式的可以直接在代码中增加:
HashUserRealm myrealm = new HashUserRealm("MyRealm",System.getProperty("jetty.home")+"/etc/realm.properties");
server.setUserRealms(new UserRealm[]{myrealm});
这个是jetty 6的写法,jetty 7的写法你上面已经有了。
如果是在jetty.xml里面配置的话,可以这样:
&Configure class="org.eclipse.jetty.webapp.WebAppContext"&
&Set name="contextPath"&/test&/Set&
&Set name="war"&&SystemProperty name="jetty.home" default="."/&/webapps/test&/Set&
&Get name="securityHandler"&
&Set name="loginService"&
&New class="org.eclipse.jetty.security.HashLoginService"&
&Set name="name"&Test Realm&/Set&
&Set name="config"&&SystemProperty name="jetty.home" default="."/&/etc/realm.properties&/Set&
&/Configure&
不熟悉,不过给你推荐一篇文章 http://blog.csdn.net/lovingprince/article/details/6364767
看看jetty安装文件夹下的etc文件中的realm.properties文件。
jetty: MD5:164c88b50af52c89945d44,user
admin: CRYPT:adpexzg3FUZAk,server-administrator,content-administrator,admin
other: OBF:1xmk1w261u9r1w1c1xmq,user
plain: plain,user
user: password,user
digest: MD5:6eabfbc385bc2bb754e297,user
并不像你想像中的那么大,主要使用的就是配置文件中提及的几个类,至于set get都是这些类中的方法而已,只要你设置了正确的属性,那么启动就没有问题。jetty本身就很小,想要使用配置文件或是在应用程序中编程实现都是很容易的事情。这还要取决于你的需求有多大。了解了配置文件中怎么启动的服务器,你就会相应了解在应用程序中应该怎么编程实现了。
我刚才测试了一下,如果你在web.xml里增加了下面的配置,那么jetty启动的时候就会报No LoginService的错误:
&security-constraint&
&web-resource-collection&
&web-resource-name&A Protected Page&/web-resource-name&
&url-pattern&/*&/url-pattern&
&/web-resource-collection&
&auth-constraint&
&role-name&admin&/role-name&
&role-name&user&/role-name&
&role-name&moderator&/role-name&
&/auth-constraint&
&/security-constraint&
&login-config&
&auth-method&BASIC&/auth-method&
&realm-name&MyRealm&/realm-name&
&/login-config&
不知道你的web应用里面是否也有这些配置。
&?xml version="1.0"& encoding="ISO-8859-1"?&
&!DOCTYPE Configure PUBLIC "-//Jetty//Configure//EN" "http://www.eclipse.org/jetty/configure.dtd"&
&Configure class="org.eclipse.jetty.webapp.WebAppContext"&
& &Set name="contextPath"&/template&/Set&
& &Set name="war"&&SystemProperty name="jetty.home" default="."/&/webapps/Template.war&/Set&
& &Set name="extractWAR"&true&/Set&
& &Set name="copyWebDir"&false&/Set&
& &Set name="defaultsDescriptor"&&SystemProperty name="jetty.home" default="."/&/etc/webdefault.xml&/Set&
& &Get name="securityHandler"&
&&& &Set name="loginService"&
&&&&& &New class="org.eclipse.jetty.security.HashLoginService"&
&&& &Set name="name"&Test Realm&/Set&
&&& &Set name="config"&&SystemProperty name="jetty.home" default="."/&/etc/realm.properties&/Set&
&&&&& &/New&
&&& &/Set&
&&& &Set name="checkWelcomeFiles"&true&/Set&
& &/Get&
&/Configure&
不知道楼主是否对jetty安装文件下的context文件里的配置文件有所研究,如果想要在jetty中部署你的web应用程序,需要增加这样的配置文件,如果不想使用配置文件而想嵌入应用程序中,也应该实现配置文件中所需要的最少步骤。从配置文件中可以看出,在jetty中启动一个web应用程序是从WebAppContext类开始的,其中需要配置它的属性,如启动时的地址,启动时的war包的位置,还有就是配置securityHandler中的loginService。这些配置相应的也就能够体现在你的java程序中了。
已解决问题
未解决问题

我要回帖

更多关于 jetty root 的文章

 

随机推荐