如何在arm平台上arm java运行环境Jetty5

Java(24)
q嵌入式(13)
& &Jetty虽然是Java编写的程序,可以跨平台使用,但需要java虚拟机来启动,而java虚拟机并不是跨平台的,要重新寻找一个能在linux系统中使用且占用空间尽可能小的java虚拟机。由于arm只提供最多52M的空间,所以不得不排除我们最常用的sun公司的jre,因为它的安装目录达到134M,大大超过可用空间,裁剪工作也不太容易。
经过查找资料,基本确定以下几种方案:
1)CVM + jetty5
&&& SUN公司的J2ME是专为移动设备设计的,在移动通信设备上已经有广泛的应用,很适合在嵌入式中使用。CVM是一个具有完整的J2SE L3 VM支持能力的Java虚拟机,但又比标准的J2SE VM小。作为一个全功能的Java虚拟机,CVM几乎支持J2SE VM的所有先进特性,包括最底层的调错处理和本地语言接口。
2)Android + i-jetty
&&& i-jetty是google公司基于jetty开发的运行在Android平台上的web容器,使手机也能搭建web服务。
3)Jamvm + GNU classpath + jetty5
&&& Jamvm是一个c语言编写的开源的java虚拟机,它使用GNU classpath作为java类库。
&&& 首先采用第一种方案,具体操作过程见我的另一篇文章,这里只想说明结果。在对arm平台的CVM进行测试后发现,自带的HelloWorld和Test程序输出结果正常,但是启动jetty就会出现java.lang.UnsatisfiedLinkError异常,根据出错提示查看类库确实缺少很多类。后来使用裁剪的rt.jar仍然出现异常,看来CVM只适合小应用程序,对jetty这种比较大型的网络程序不太适合。
&&& 第二种方案没有过多去研究就否定了,我们的arm板运行的是linux,不可能更换成Android,如果想要使用i-jetty就得安装Android模拟器,可是该模拟机占用空间不小,也就没有花费太长时间去尝试。
&&& 第三种方案是研究时间最长,最有可能实现的方案了。虽然arm板上已有linux,但由于硬件限制不能在其上编译程序,所以还要准备其他的主机来完成编译工作,然后再将文件复制到arm板上。起先使用同事给我的Redhat Linux虚拟镜像,但是无论怎样编译classpath都编译不过。网上查找了很多有关这方面的资料,都没有人在Redhat下编译jamvm + classpath成功的例子,倒是在Ubuntu下成功过。于是自己在VMware中安装了Ubuntu 8.04服务器版的虚拟镜像(可从项目服务器下载),经过几天时间的编译、调错,终于找出能够编译成功的版本组合。
&&& 下面主要讲解的编译环境和操作过程就是基于第三种方案jamvm + GNU classpath。
编译环境及工具
Ubuntu 8.04虚拟镜像
&&& 项目服务器上的镜像,已安装了编译所需的其他工具如gcc、zlib、gcj、ecj等, 如果使用其他Ubuntu版本,需在编译时根据提示安装相应的程序。&&
Arm交叉编译链 4.3.2
&&& 提供的虚拟镜像中已经安装好,不需再安装,用来编译arm平台上运行的c和c++程序。&&
GNU Classpath 0.93
&&& Jamvm使用的java类库,需要交叉编译。&&
Jamvm 1.5.1
&&& 一个开源的java虚拟机,需要交叉编译。&&
Jetty 5.1.12
&&& Java编写的开源web容器,不需要交叉编译。&&
&&& 我们大部分工作都是在虚拟机中完成的,包括编译、打包、测试等等,虽然在arm上运行和虚拟机上运行结果有可能不尽相同,但经过我的运行测试发现,在arm上运行不了而出错的话,在虚拟机中运行出现同样的错误,所以一般我都会在虚拟机中调试好,程序能够运行再放到arm板,这样成功率更大。
&工作目录&\home\kiki\work
&&& Arm交叉编译链、GNU Classpath、jamvm和jetty5源程序都存放在work工作目录下,环境变量中需指定arm交叉编译链的路径。
&目标目录&\tmp
&&& 为了能与arm平台的目标目录相同,使用tmp文件夹作为编译的目标文件夹。用来存放GNU Classpath和jamvm编译后的文件,需要在configure时指定目标路径。
转自:/blog/list_467ab95cab4976_1.html
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:336737次
积分:3875
积分:3875
排名:第7639名
原创:54篇
转载:258篇
评论:18条
(29)(2)(3)(23)(7)(6)(6)(48)(72)(8)(1)(3)(9)(6)(14)(12)(5)(16)(13)(31)3905人阅读
c# + SQL Server 转型为: Java + MySQL之路:
从Jfinal开始,第一步先走完整个流程,主要是发布部署到服务器,Jetty因其简单易用而广为推荐,遂百度之,进而实行之,测试Pass:
1.百度jetty官网,有多个版本,本人用了8.1~~~的版本并依照如下描述顺利实施。(运行在JDK6及以上版本)
2. 解压压缩包,且将其目录路径定义为${JETTY_HOME}
3. 启动Jetty服务
3.1 进入${JETTY_HOME}目录,然后运行“java -jar start.jar”,就可以启动Jetty server了
3.2 打开浏览器,访问http://localhost:8080,此时可以看到Jetty的欢迎页面了。
4. Jetty配置
4.1 Jetty的配置文件都是放在${JETTY_HOME}/etc目录下;
4.2 通过${JETTY_HOME}/etc/jetty-webapps.xml文件,可以看出Jetty中默认将所有的web app都放在了${JETTY_HOME}/webapps目录下;
4.3 在Jetty包中默认带了一个test.war的应用,可以${JETTY_HOME}/webapps目录下找到这个文件,在启动Jetty服务的时候默认已经部署了test.war应用。对于test.war文件,Jetty还定义了context文件,放在${JETTY_HOME}/contexts/test.xml,其中将contextPath定义成了“/”,这就是为什么默认访问http://localhost:8080/的时候为什么是访问test应用的原因了。
5 部署新的web应用程序
5.1 对于war包的部署,只需要将war文件放到${JETTY_HOME}/webapps目录下,然后就可以通过浏览器直接访问了;
5.2 对于web应用程序目录的部署,此时可以将web应用程序目录复制到${JETTY_HOME}/webapps/&myapp&目录下,然后在${JETTY_HOME}/contexts/&myapp&.xml文件,其中内容如下:
重新启动Jetty服务,访问http://localhost:8080/myapp就可以看到新部署web应用程序了。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:158122次
积分:1838
积分:1838
排名:千里之外
原创:20篇
转载:99篇
评论:18条
(1)(1)(1)(2)(1)(2)(1)(2)(2)(1)(1)(1)(1)(1)(2)(2)(1)(1)(1)(6)(1)(1)(2)(66)(3)(1)(2)(6)(6)Jetty的使用
我的图书馆
Jetty的使用
的首页地址是
进入下载介绍页面,由于Jetty7之后,托管服务有Eclipse接替,所以jetty6.1之前(包含6
.1)继续由Codehaus提供下载服务,在该页面的下方有如下信息:
-8 eclipse
HTTP/1.1 RFC2616
Development
Standardized async
-7 eclipse
HTTP/1.1 RFC2616
Almost stable
org.eclipse.jetty
HTTP/1.1 RFC2616
2.1 or 2.0
Async SSL, AJP, cometd, testing
HTTP/1.1 RFC2616
2.1 or 2.0
Deprecated
Continuations, IOC, NIO, dynamic buffers, smaller, faster, better
HTTP/1.1 RFC2616
J2EE 1.4 Compliance tested, optimizations, geronimo integration.
HTTP/1.1 RFC2616
Deprecated
Schema, JettyPlus
HTTP/1.1 RFC2616
HTTP/1.1 RFC2616
Deprecated
JAXP1.1, AJP13(mod_jk)
HTTP/1.1 RFC2616
Deprecated
HTTP/1.1 RFC2068
HTTP/1.1 RFC2068
Fossilized
HTTP/1.0 RFC1945
HTTP/1.0 RFC1945
&本书讨论的Jetty
.1,也是目前使用最多的稳定版本,我们到
.1系列最新的6
.1.22版本:
16-Nov- 5.7M
16-Nov- 24M
&& &我们下载24M大小的
.1.22.zip文件,另外一个文件有5M是因为只包含了Jetty
源码和实例源码,jetty
.1.22.zip文件包包含了 api文档,实例代码、jetty
源码、发行Jar文件、各操作系统下的启动脚本和其他部分依赖包。也许你会有疑问,我之前介绍Jetty
的时候说Jetty
体积非常小,是的没错!Jetty
核心文件的大小只有约700K!
&& &要运行Jetty
的首要条件当然是需要安装
JDK了,建议使用j2se 1.5以上的版本,关于JDK或者JRE的安装,为了环保这里就不再花费篇章介绍了,请参考其他网络资料。
&& &其实Jetty
所谓的安装过程也就是将下载的文件解压到指定的目录,然后根据不同的操作系统来配置环境变量而已。
&& 以后讲解如何从maven源码编译等。
2.3 使用java命令启动
&& &只要在支持j2se的平台的操作系统下,jetty
都可以运行。所以我们先介绍jetty
提供的跨平台的服务启动方式。
2.3.1 快速启动
&& & 打开控制台,定位到jetty
的安装目录,执行命令:&& & & & & &
java -jar start.jar etc/jetty
提示:关于如何执行java的jar文件请查找其他资料。
&& &start.jar 后面内容是传递给start.jar的参数,多个参数用空格隔开。
参数内容可以有以下几种:
--help & &查看帮助信息
--stop & &停止服务,下节中会讲到
--version &查看当前jetty
其他:作为Jetty
服务配置文件
&& &我们看到上条命令指定参数内容为etc/jetty
.xml,它实际指向一个 服务配置文件
,该文件是用来设置jetty
服务启动的系统配置信息。比如监听端口,发布某个目录下面的web应用,jndi的配置等等,这些将在后续章节详细描述。当然 服务配置文件
可以是多个,比如:
java -jar start.jar etc/jetty
.xml etc/jetty
&& 这条命令就指定了两个 服务配置文件
,etc/jetty
.xml和etc/jetty
-plus.xml。
&& &在后续的章节中术语“ 服务配置文件
”就是指的这些文件。
&& &使用浏览器打开地址 http://localhost:8080/ ,你将会看到jetty
的默认示例站点。
2.3.2 停止服务
&& &在刚才启动jetty
的终端窗口里面按住ctrl-c键即可。
&& &不过你可以这样来启动
java -DSTOP.PORT=8009 -DSTOP.KEY=secret -jar start.jar
启动后会在本地监听你指定的端口8009,并将在验证下次关闭命令的密码secret。现在再通过命令:
java -DSTOP.PORT=8009 -DSTOP.KEY=secret -jar start.jar --stop&
&& &就可以在本机的另外一个终端窗口来停止jetty
服务。在linux系统中,你可以先将jetty
进程转移到后台执行,然后再通过命令行来停止Jetty
&& &哦,看了上面的介绍你或许以为jetty
启动和关闭是如此麻烦,一点也不符合Jetty
小巧玲珑的气质。其实Jetty
为我们准备了各个操作系统中快捷的方式。不过记住不管何种方式最终都是通过start.jar来启动jetty
2.3.3 start.jar深入探讨
&& & 初学者可以先跳过本节。本节讨论start.jar模块的作用和细节。start.jar让jetty
各个不同的组件联合起来工作,使得jetty
看上去像一个服务器软件,同时start.jar也不过是jetty
的其中一个组件而已。了解start.jar工作原理后,我们就可以知道#jetty_home/lib下面那么多文件夹下面的jar文件是如何配被选择性地加入到classpath中去的。
start 组件提供了跨平台的启动方式。 通过启动命令 java -DDEBUG=true -jar start.jar [jetty
.xml ... ] 可以看到启动过程的debug日志信息。
&& &看看Jetty
start 在启动过程中都做了哪些操作:
自动设置正确的 jetty
根据JDK版本配置classpath,比如jdk1.5版本之前的版本只能使用jsp2.0规范所需的jar包
根据设定的classpath,构建好一个类加载器。再根据设定的main class来调用指定main class的main方法
&& &由此可见start组件是相当独立的组件,甚至我们可以在自己的项目里面单独使用该组件控制程序的启动。
&& &start.config语法
start是由一个名叫start.config的配置文件控制的,这个文件存在在
start.jar里面,路径是org/mortbay/start/start.config。熟悉
这个配置文件的内容会对jetty
作为服务器的启动过程有更好的了解。最重要的是我们知道jetty
的classpath的设置和如何通过设置系统变量来把外部类路径增加到jetty
&& &start.config的格式是每一行一条指令,如果以#开头则为注解行。指令的后面是执行条件,如果条件不符合则忽略。
&& &指令有如下几种情况:
以.path结尾: 如果.path前面的字符串存在且长度大于0,则将该类路径加入到系统类路径中
包含 “=” &: & 执行System.setProperty(property,value)调用,“=”左边为property,右边为value
以.class结尾:如果".class"前面有值的话,就设定为Main class
以.xml结尾: &如果指定的xml文件存在的话就作为jetty
服务的启动配置文件之一
以/*结尾: & &指定目录下面的所以jar或者zip文件,被加入到classpath中
以/**结尾: &指定 递归该
目录下面的所以jar或者zip文件,被加入到classpath中
以/结尾: & & 指定的目录作为classpath的一部分
其他: & & & & 作为一个文件加入到classpath中
&& &关于条件:
"&","&"," &=","&=","==","!=" 是条件的比较操作符,从左到右执行
exists 检测紧跟着后面的文件是否存在
available 检测紧跟着后面的class是否存在
!表示非;always表示true
变量nargs表示传递给start.jar的参数数量
表示java版本
&& &其他规则:
的指令按行从上到下执行
如果一个文件或者目录由于条件被否决,没有被加入到类路径中,那么即使后续指令中包含了该文件或者目录,那么同样不会被加入到
指令或者条件中, $(...) 表示获取系统属性,即一次System.getProperty()调用。如$(jetty
.class.path).path指令,当系统属性“jetty
.class.path”没有设置,那么运行时实际指令的值位 “.path”。如果设置系统属性“jetty
.class.path”的值为"/usr/local/jarlib",那么运行时实际指令值为 "/usr/local/jarlib.path"
start.config文件
.class.path).path & & & & & & & & & & & & always
.lib)/** & & & & & & & & & & & & & & & & &exists $(jetty
# Try different settings of jetty
.home until the jetty
.jar is found.
.home=. & & & & & & & & & & & & & & & & & & ! exists $(jetty
.home)/start.jar&
.home=.. & & & & & & & & & & & & & & & & & &! exists $(jetty
.home)/start.jar
.home=/home/jetty
& & & & & & & & & & & & & ! exists $(jetty
.home)/start.jar
.home=/C:/jetty
& & & & & & & & & & & & & & ! exists $(jetty
.home)/start.jar
.home=. & & & & & & & & & & & & & & & & & & ! exists $(jetty
.home)/start.jar&
# The main class to run
org.mortbay.xml.XmlConfiguration.class
$(start.class).class
# The default configuration files
.home)/etc/jetty
.xml & & & & & & & & & & &nargs == 0
# Set the jetty
.home)/lib/* & & & & & & & & & & & & & & &always
# Set the classpath for the supporting cast & & & & & & &&
.home)/lib/jsp-2.1/* & & & & & & & & & & &java &= 1.5 &&
.home)/lib/jsp-2.0/* & & & & & & & & & & &! available org.apache.jasper.servlet.JspServlet & & & & & & &&
.home)/lib/management/* & & &&
.home)/lib/management/mx4j/* & & & & & & &java & 1.5 & & & & &&
.home)/lib/naming/* & & & & & & & & & & & & & & &
.home)/lib/plus/* & & & & & & & & & & & & & &&
.home)/lib/xbean/* & & & & & & & & & & & & & &&
.home)/lib/wadi/* & & & & & & & & & & & & & &&
.home)/lib/grizzly/* & & & & & & & & & & & & & &&
.home)/lib/annotations/* & & & & & & & & &java &= 1.5 & & & & & & & & & & & & & &
.home)/lib/jre1.5/** & & & & & & & & & & &java &= 1.5
# Recursively add all jars and zips from the ext lib
.home)/lib/ext/** & & & & & & & & & & & &always
# Try some standard locations for anything missing.
/usr/share/java/ant.jar & & & & & & & & & & & & &! available org.apache.tools.ant.Main
# Add a resources directory if it is there
.home)/resources/
2.4我们可以学到什么
2.5 Windows系统下启动和关闭控制
利用Win32Wrapper工具(
)使得在window系统上可以以控制台或者Window服务的方式运行jetty
程序,使用起来非常方便。
&& &在 $jetty_home/bin目录下有如下几个相关文件:Jetty
-Service.exe , jetty
-service.conf。双击Jetty
-Service.exe 文件,即可以控制台的方式来运行jetty
-service.conf 显然是配置文件了,一会详细介绍。
&&& &(以后我们用 $jetty_home来表示Jetty
的安装目录)
&&注册Windows服务
&& &&& &打开命令行,转到 $jetty_home/bin 目录,执行命令:
&& & & &E:/jetty
.1.22/bin&Jetty
-Service.exe --install jetty
-service.conf
&& &&& &wrapper &| Jetty6-Service installed.
&&启动服务
&& & & &执行命令:&Jetty
-Service.exe --start jetty
-service.conf&
&&停止服务
&& &&& &&执行命令:Jetty
-Service.exe --stop jetty
-service.conf&
&&注销服务
&& &&& &&执行命令:Jetty
-Service.exe --remove jetty
-service.conf&
&& &你在成功注册Windows服务后,可以修改服务让其随系统自动启动。
-service.conf 配置文件
wrapper.java.classpath.1=../lib/win32/*.jar & & & & & & &&
wrapper.java.classpath.2=../lib/*.jar
wrapper.java.classpath.3=../start.jar
wrapper.java.library.path.1=../lib/win32/
#wrapper.java.additional.n可以设置jvm参数
wrapper.java.additional.1=-Djetty.home=../ & & & & &
#设置系统属性jetty
.home,指定jetty
wrapper.java.additional.2=-Djetty.logs=../logs&& &&& & #设置系统属性jetty
wrapper.java.initmemory=3&& &&& &&& &&& &&& &&& &&& &&& && #jvm初始内存大小
wrapper.java.maxmemory=64&& &&& &&& &&& &&& &&& &&& && &
#jvm内存大小
wrapper.java.mainclass=org.mortbay.jetty
.win32service.JettyServiceWrapperListener
#wrapper.app.parameter.n可以设置应用程序参数,及 -jar start.jar 后面的参数
#例如 wrapper.app.parameter.1=../etc/jetty
.xml ../etc/jetty
wrapper.app.parameter.1=../etc/jetty
wrapper.console.format=PM
wrapper.console.loglevel=INFO
wrapper.logfile=../logs/jetty
-service.log&& &&& &&& #输出到System.out到内容将同时被记录在该文件
wrapper.logfile.format=LPTM
wrapper.logfile.loglevel=INFO
wrapper.logfile.maxsize=0&& &&& &&& &&& &&& &&& &&& #jetty
-service.log文件的最大尺寸,0表示不限制
wrapper.logfile.maxfiles=0&& &&& &&& &&& &&& &&& &&& #当限制文件大小时,允许存在的最多文件个数
wrapper.syslog.loglevel=NONE
wrapper.ntservice.name=Jetty
wrapper.ntservice.displayname=Jetty6-Service
wrapper.ntservice.description=Jetty
is an open-source, standards-based, full-featured web server implemented entirely in java
wrapper.ntservice.starttype=AUTO_START
wrapper.ntservice.interactive=false
#Win32Wrapper中定义一个触发器,当控制抛出OutOfMemoryError错误,则重启Jetty
wrapper.filter.trigger.1=java.lang.OutOfMemoryError&&
wrapper.filter.action.1=RESTART
Linux系统下启动和关闭控制
&& & 在$jetty_home/bin目录下,Jetty
为我们提供了一个名为jetty
.sh的shell脚本文件,在linux环境下我们用这命令 ./jetty
.sh start 和 .jetty
.sh stop 命令来启动和关闭jetty
.sh在启动Jetty
后,将jvm的系统进程ID保存在一个$JETTY_RUN/jetty
.pid的文件里面,然后在收到stop命令后读取pid来关闭相应进程。
&& & 在jetty
.sh里面还可以定制变量来控制jetty
,如指定JAVA_HOME目录、指定jvm最大内存、指定pid文件的位置等。
.1 系统变量的设置
提示:在编辑变量的时候“=”两边千万不要有空格。
下面逐个介绍各变量的作用:
JAVA_HOME&& &
&& &指定Java安装目录。当你需要指定特定位置的jdk或者jetty
搜索不到java安装目录时,需要设定该变量。
例如: & &JAVA_HOME=/usr/local/java/jdk1.5.0_10/
&& & 执行java命令。默认值为 $JAVA_HOME/bin/java。一般不需要设置。
JAVA_OPTIONS
&& &JVM的可选参数。你可以利用这个选项配置内存大小、系统变量等等其他参数,这个变量非常有用。
例如:JAVA_OPTIONS="-Xmn128M -Xms256M -Xmx1024M&
-Djava.nio.channels.spi.SelectorProvider=sun.nio.ch.EPollSelectorProvider"
.pid文件的存放目录。默认值为 /var/run, /usr/var/run &或 /tmp 三者之一
。如果你需要在一台服务器上启动多个安装目录下的jetty
,那么必须设定该变量以避免共享同一pid文件而造成冲突。建议设置为各个安装目录下面新建的run目录。
&& &pid文件的路径。默认值 $JETTY_RUN/jetty
.pid。一般不需要设置。
JETTY_ARGS
&& &传递给
的参数。值 java -jar start.jar 后面的部分。
JETTY_HOME
安装目录。虽然jetty
尝试搜索jetty
安装目录,但是我们还是建议设定该变量。
&& &JETTY_HOME=/usr/local/jetty
&& &在启动java时增加jvm 参数 “-Djetty.home=$JETTY_HOME” 。所以在Linux环境下,start.jar的自动搜索jetty_home的动作会被取消。
JETTY_USER
&& &如设定该值,那么将以该用户的身份启动jetty
JETTY_PORT
服务器监听端口。如果设定该值,那么在启动java时增加jvm 参数 “-Djetty.port=$JETTY_PORT” 。
启动配置文件里,&Set name="Port"&&SystemProperty name="jetty
.port" default="8080"/&&/Set&这个语句将会使用我们这里指定的端口值。
.2 命令参数
&& &系统控制台中,跳转到 $jetty_home/bin目录下,输入“ &./jetty
.sh start”,其中start为命令参数,现在介绍几个常用命令参数
&& &启动jetty
&& &停止jetty
&& &重启jetty
&& &挂起服务
显示当前jetty
实例运行时所使用的变量参数,可以用来查看变量是否设置正确。
显示结果实例:
node-189 bin # ./jetty
Checking arguments to Jetty
JETTY_HOME & & = &/usr/local/jetty
JETTY_CONF & & =
JETTY_RUN & & &= &/var/run
JETTY_PID & & &= &/var/run/jetty
JETTY_PORT & & =
JETTY_LOGS & & =
CONFIGS & & & &= &/usr/local/jetty
.1.15/etc/jetty
-logging.xml /usr/local/jetty
.1.15/etc/jetty
JAVA_OPTIONS & = & -Djetty.home=/usr/local/jetty
.1.15 -Djava.io.tmpdir=/tmp
JAVA & & & & & = &/usr/local/java/jdk1.5.0_10/bin/java
CLASSPATH & & &= &/usr/local/java/jdk1.5.0_10/lib:/usr/local/java/jdk1.5.0_10/jre/lib
RUN_CMD & & & &= &/usr/local/java/jdk1.5.0_10/bin/java &-Djetty.home=/usr/local/jetty
.1.15 -Djava.io.tmpdir=/tmp -jar /usr/local/jetty
.1.15/start.jar &/usr/local/jetty
.1.15/etc/jetty
-logging.xml /usr/local/jetty
.1.15/etc/jetty
running pid=24573
.3 相关配置文件
/etc/jetty
&& &如果该文件存在,那么该文件的内容会被解析用来设定jetty
启动配置文件
(configurations),规则如下:
以“#”开头:该行内容作为注解
指向一个文件的路径:如果该文件存在则作为jetty
启动的一个
启动配置文件
指向一个目录的路径:如果该目录存在,则目录下的所有.xml的文件会被作为
启动配置文件
&& &如果不存在该文件,jetty
.sh将会使用默认值 :
“ ${JETTY_HOME}/etc/jetty
-logging.xml ${JETTY_HOME}/etc/jetty
/etc/default/jetty
、/etc/default/jetty6 和 $HOME/.jettyrc
&& &若任何一个文件存在,那么jetty
.sh文件执行时都会执行它。我们可以在这些文件中配置系统变量。
TA的最新馆藏

我要回帖

更多关于 genymotion 运行arm 的文章

 

随机推荐