世界速递!catalina.bat脚本启动Tomcat源码分析
概述
Tomcat 的三个最重要的启动脚本:
(相关资料图)
startup.batcatalina.batsetclasspath.bat
上一篇咱们分析了 startup.bat 脚本
这一篇咱们来分析 catalina.bat 脚本. 至于 setclasspath.bat 这个脚本, 相信看完这一篇, 就可以自己看懂这个脚本了. 可以点击 [Tomcat 源码分析系列] (附件) : setclasspath.bat 脚本 查看附注释的 setclasspath.bat 脚本
catalina.bat
这个脚本的代码有点多, 就单独弄了一篇博客展示 catalina.bat 脚本中的内容. 点击 [Tomcat 源码分析系列] (附件) : catalina.bat 脚本 查看.
下面咱们就按照脚本中的内容一行行的来分析.
@echo offsetlocal
这两个命令可以参考上一篇的文章的解释
第一块脚本代码
rem Suppress Terminate batch job on CTRL+Cif not ""%1"" == ""run"" goto mainEntryif "%TEMP%" == "" goto mainEntryif exist "%TEMP%\%~nx0.run" goto mainEntryecho Y>"%TEMP%\%~nx0.run"if not exist "%TEMP%\%~nx0.run" goto mainEntryecho Y>"%TEMP%\%~nx0.Y"call "%~f0" %* <"%temp%\%~nx0.y"rem use="" provided="" errorlevelset="" retval="%ERRORLEVEL%del" q="">NUL 2>&1exit /B %RETVAL%:mainEntrydel /Q "%TEMP%\%~nx0.run" >NUL 2>&1
脚本的作用
判断用户是否使用
catalina.bat run
来启动 Tomcat 的. 如果用户使用 startup.bat 脚本启动 Tomcat, 那么这段脚本不会被执行.
这段代码看起来很乱, 慢慢分析.
第一行:
注释, 意思就是: 禁止使用 CTRL+C 来终止批处理任务, 也不知道是怎么禁止的.
第二行:
if not ""%1"" == ""run"" goto mainEntry
首先明白这里的这个 "%1" 这个变量代表的是什么? 正常情况下, 这个脚本是被 startup.bat 脚本调用的, 被调用的同时传递了一个 start 参数过来(上一篇分析得出的). 在 批处理命令 中 %1 就表示命令之后的第一个参数, 在这里指的就是 start. 所以 "%1" = start. 如果用户用 catalina.bat run 命令启动 Tomcat 的话, 那么这里的 "%1" = run.
第三行:
if "%TEMP%" == "" goto mainEntry
这里的 %TEMP% 很有可能被认为是 空, 其实这里可以读取到系统的环境变量. 所以, 这里的 %TEMP% 就是系统的环境变量值, 通常装完 windows 系统的话, 系统会自动配置上这个环境变量. 所以这里一般是有值的. 大家可以去系统的环境变量看一下它指向那个目录, 一般就是 C:\Users\用户名\AppData\Local\Temp. 注意: AppData 是一个隐藏目录.
第四行:
if exist "%TEMP%\%~nx0.run" goto mainEntry
这里又出现了一个新的东西 %~nx0 . 在批处理中, 我们知道 %1 表示的是程序之后的第一个参数, 那么 %0 呢? %0 表示这个可执行程序的名称, %~nx0 的话就是程序的名称+扩展名 在这里就是 catalina.bat . 大家可以写一个小脚本(test.bat)验证一下: (我的脚本放在 D 盘下)
脚本内容:
@echo offecho "%~nx0"echo "%1"
执行结果:
PS D:\> .\test.bat Hello"test.bat""Hello"PS D:\>
第五行:
echo Y>"%TEMP%\%~nx0.run"
这段代码很简单, 就是写入字符 Y 到 %TEMP%\catalina.bat.run 文件中.
第六行:
if not exist "%TEMP%\%~nx0.run" goto mainEntry
又判断了一下 %TEMP%\catalina.bat.run 文件是否存在.
第七行:
echo Y>"%TEMP%\%~nx0.Y"
同第五行, 写入 Y 到 %TEMP%\catalina.bat.Y . 如果文件不存在, 则新建一个.
第八行:
call "%~f0" %* <"%TEMP%\%~nx0.Y"
这一行有点意思. 又出现了两个新的东西: (因为 markdown 语法限制, 把下面代码写到代码块里)
- "%~f0" : 简单说就是表示当前命令的绝对路径.- "%*" : 我们知道 %1 表示第一个参数, 依次类推, %2 表示第二个.... 那么 %* 就很好理解了, 代表所有参数.
验证一下
脚本内容:
@echo offecho "%*"echo "%~f0"
执行结果:
PS D:\> .\test.bat Hello World"Hello World""D:\test.bat"PS D:\>
那么后面的 <"%TEMP%\%~nx0.Y" 意思就是读取 %TEMP%\catalina.bat.Y 文件中的内容. 之后又通过 call 进行调用. 我们自己写一个例子, 在 D 盘建立 test.bat 文件, 再建立 catalina.bat.Y 文件
脚本内容:
call "%~f0" %* < D:/catalina.bat.Y
catalina.bat.Y 文件内容
Y
执行结果:
........D:\>call "D:\test.bat" Hello World 0call "D:\test.bat" Hello World 0call "D:\test.bat" Hello World 0call "D:\test.bat" Hello World 0call "D:\test.bat" Hello World 0call "D:\test.bat" Hello World 0call "D:\test.bat" Hello World 0<D: catalina.bat.y******="" u="" s="" i="" n="" exceeds="" limits="" ******recursion="" count="593," stack="" usage="90" percent******="" c="" h="" processing="" is="" a="" b="" o="" r="" t="" e="" d="" ******
最上面省略了很多重复代码, 从这里发现它不断地调用自己本身, 直到超出了堆栈的限制才停止. 我们如果加上 @echo off 的话
@echo offcall "%~f0" %* < D:/catalina.bat.Y
结果只会出现
D:\>.\test.bat Hello World****** B A T C H R E C U R S I O N exceeds STACK limits ******Recursion Count=593, Stack Usage=90 percent****** B A T C H PROCESSING IS A B O R T E D ******
我们这里只需要明白这些命令的作用就可以, 稍后我们会总结 Tomcat 执行这些命令的目的.
第十行:
set RETVAL=%ERRORLEVEL%
我们如果了解 Linux 的话都知道, 每个命令的执行都会返回一个执行完成之后的退出码. Linux执行完一条命令之后用 echo $? 来查看上一条命令的退出码. 在 Windows 中也是一样的, 命令执行完之后都有自己的退出码. 这里的 %ERRORLEVEL% 就是取的上面的 call 命令的退出码. 赋值给一个变量 RETVAL
第十一行:
del /Q "%TEMP%\%~nx0.Y" >NUL 2>&1
这里又出现了一个 del 命令, 很容易联想到 delete, 那么 /Q 是什么意思呢? 静默删除, 不会给你任何提示, 就比如 Linux 中的 rm -f 一样, 这里是删除 %TEMP%\catalina.bat.Y 这个文件. 后面的 >NUL 2>&1 又是什么意思呢? 于 Linux 中的输出流的重定向原理是一样的. (因为 markdown 语法限制, 把下面代码写到代码块里)
- >NUL : 表示将输出重定向到 NUL 中, 你什么也看不到- 2>&1 : 2:错误输出, &1: 标准输出, 意思就是将错误消息输出到标准输出中.- >NUL 2>&1 : 就是先将错误消息输出到标准输出中, 然后再输出到 NUL 中.
第十二行:
exit /B %RETVAL%
退出当前批处理, /B 指定退出时的编号, 把 RETVAL 最为 退出码, 也就是 call 执行的命令 的退出码.
最后两行:
:mainEntrydel /Q "%TEMP%\%~nx0.run" >NUL 2>&1
定义一个 mainEntry 标签, 然后删除 临时目录中的 catalina.bat.run 文件.
总结第一段脚本的功能
简单说, 这段代码的作用就是调用本身, 判断临时目录中的文件是否存在来避免二次回调自己. 感觉写的好复杂.
下面就进入 Tomcat 的正式启动过程, 并没有开始执行 main 方法
第二段脚本代码
rem Guess CATALINA_HOME if not definedset "CURRENT_DIR=%cd%"if not "%CATALINA_HOME%" == "" goto gotHomeset "CATALINA_HOME=%CURRENT_DIR%"if exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomecd ..set "CATALINA_HOME=%cd%"cd "%CURRENT_DIR%":gotHomeif exist "%CATALINA_HOME%\bin\catalina.bat" goto okHomeecho The CATALINA_HOME environment variable is not defined correctlyecho This environment variable is needed to run this programgoto end:okHomerem Copy CATALINA_BASE from CATALINA_HOME if not definedif not "%CATALINA_BASE%" == "" goto gotBaseset "CATALINA_BASE=%CATALINA_HOME%":gotBase
这段脚本还是比较简单的, 主要是设置了两个环境变量 CATALINA_HOME 和 CATALINA_BASE . 如果没有配置 CATALINA_BASE 环境变量的话, 直接引用 CATALINA_HOME 的值 静下心来稍微看一下就懂了.
第三段脚本代码
rem Ensure that neither CATALINA_HOME nor CATALINA_BASE contains a semi-colonrem as this is used as the separator in the classpath and Java provides norem mechanism for escaping if the same character appears in the path. Check thisrem by replacing all occurrences of ";" with "" and checking that neitherrem CATALINA_HOME nor CATALINA_BASE have changedif "%CATALINA_HOME%" == "%CATALINA_HOME:;=%" goto homeNoSemicolonecho Using CATALINA_HOME: "%CATALINA_HOME%"echo Unable to start as CATALINA_HOME contains a semicolon (;) charactergoto end:homeNoSemicolonif "%CATALINA_BASE%" == "%CATALINA_BASE:;=%" goto baseNoSemicolonecho Using CATALINA_BASE: "%CATALINA_BASE%"echo Unable to start as CATALINA_BASE contains a semicolon (;) charactergoto end:baseNoSemicolon
这里主要是判断 CATALINA_HOME 环境变量的值 和 CATALINA_BASE 环境变量的值是否以 分号为结尾, 如果以 分号为结尾的话, 就报错退出.
第四段脚本代码
rem Ensure that any user defined CLASSPATH variables are not used on startup,rem but allow them to be specified in setenv.bat, in rare case when it is needed.set CLASSPATH=rem Get standard environment variablesif not exist "%CATALINA_BASE%\bin\setenv.bat" goto checkSetenvHomecall "%CATALINA_BASE%\bin\setenv.bat"goto setenvDone:checkSetenvHomeif exist "%CATALINA_HOME%\bin\setenv.bat" call "%CATALINA_HOME%\bin\setenv.bat":setenvDonerem Get standard Java environment variablesif exist "%CATALINA_HOME%\bin\setclasspath.bat" goto okSetclasspathecho Cannot find "%CATALINA_HOME%\bin\setclasspath.bat"echo This file is needed to run this programgoto end:okSetclasspathcall "%CATALINA_HOME%\bin\setclasspath.bat" %1if errorlevel 1 goto end
设置一个临时环境变量: CLASSPATH. 如果 Tomcat 的 bin 目录下面存在 setnv.bat 脚本的话, 就执行它. 通常情况下是没有的. 继而又判断 setclasspath.bat 脚本是否存在, 如果不存在的话, 直接报错, 停止启动 Tomcat. 如果存在的话, 就去调用它, 并把 第一个参数传进去.
setclasspath.bat 这个脚本主要设置了几个环境变量
JAVA_HOMEJRE_HOMEJAVA_ENDORSED_DIRS = %CATALINA_HOME%\endorsed_RUNJAVA = %JRE_HOME%\bin\java.exe_RUNJDB = %JAVA_HOME%\bin\jdb.exe
第五段脚本代码
rem Add on extra jar file to CLASSPATHrem Note that there are no quotes as we do not want to introduce randomrem quotes into the CLASSPATHif "%CLASSPATH%" == "" goto emptyClasspathset "CLASSPATH=%CLASSPATH%;":emptyClasspathset "CLASSPATH=%CLASSPATH%%CATALINA_HOME%\bin\bootstrap.jar"if not "%CATALINA_TMPDIR%" == "" goto gotTmpdirset "CATALINA_TMPDIR=%CATALINA_BASE%\temp":gotTmpdirrem Add tomcat-juli.jar to classpathrem tomcat-juli.jar can be over-ridden per instanceif not exist "%CATALINA_BASE%\bin\tomcat-juli.jar" goto juliClasspathHomeset "CLASSPATH=%CLASSPATH%;%CATALINA_BASE%\bin\tomcat-juli.jar"goto juliClasspathDone:juliClasspathHomeset "CLASSPATH=%CLASSPATH%;%CATALINA_HOME%\bin\tomcat-juli.jar":juliClasspathDone
这段代码主要做了三件事:
把 Tomcat bin 目录下的 bootstrap.jar 加入到环境变量中设置 CATALINA_TMPDIR 环境变量的值为 Tomcat 目录下的 temp 目录把 Tomcat bin 目录下的 tomcat-juli.jar 加入到环境变量中
第六段脚本代码
if not "%JSSE_OPTS%" == "" goto gotJsseOptsset JSSE_OPTS="-Djdk.tls.ephemeralDHKeySize=2048":gotJsseOptsset "JAVA_OPTS=%JAVA_OPTS% %JSSE_OPTS%"rem Register custom URL handlersrem Do this here so custom URL handles (specifically "war:...") can be used in the security policyset "JAVA_OPTS=%JAVA_OPTS% -Djava.protocol.handler.pkgs=org.apache.catalina.webresources"if not "%LOGGING_CONFIG%" == "" goto noJuliConfigset LOGGING_CONFIG=-Dnopif not exist "%CATALINA_BASE%\conf\logging.properties" goto noJuliConfigset LOGGING_CONFIG=-Djava.util.logging.config.file="%CATALINA_BASE%\conf\logging.properties":noJuliConfigset "JAVA_OPTS=%JAVA_OPTS% %LOGGING_CONFIG%"if not "%LOGGING_MANAGER%" == "" goto noJuliManagerset LOGGING_MANAGER=-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager:noJuliManagerset "JAVA_OPTS=%JAVA_OPTS% %LOGGING_MANAGER%"
主要是追加一系列的启动参数到 JAVA_OPTS 这个环境变量中.
第八段脚本代码
echo Using CATALINA_BASE: "%CATALINA_BASE%"echo Using CATALINA_HOME: "%CATALINA_HOME%"echo Using CATALINA_TMPDIR: "%CATALINA_TMPDIR%"if ""%1"" == ""debug"" goto use_jdkecho Using JRE_HOME: "%JRE_HOME%"goto java_dir_displayed:use_jdkecho Using JAVA_HOME: "%JAVA_HOME%":java_dir_displayedecho Using CLASSPATH: "%CLASSPATH%"
主要是打印相关的环境变量信息.
第九段脚本代码
set _EXECJAVA=%_RUNJAVA%set MAINCLASS=org.apache.catalina.startup.Bootstrapset ACTION=startset SECURITY_POLICY_FILE=set DEBUG_OPTS=set JPDA=
设置一些列的环境变量:
_RUNJAVA : %JRE_HOME%\bin\java.exeMAINCLASS : 指定了 Tomcat 的启动类, 没错 main 方法就是在这个类里面.ACTION : 动作: 就是启动SECURITY_POLICY_FILE : 安全策略文件, 如果启动的时候加上了 -security 参数的话, 下面会对这个参数指定到 Tomcat 的 conf 目录下的 catalina.policy 文件.JPDA : 这个参数可以百度一下, 我们平时几乎用不到.
第十段代码
if not ""%1"" == ""jpda"" goto noJpdaset JPDA=jpdaif not "%JPDA_TRANSPORT%" == "" goto gotJpdaTransportset JPDA_TRANSPORT=dt_socket:gotJpdaTransportif not "%JPDA_ADDRESS%" == "" goto gotJpdaAddressset JPDA_ADDRESS=localhost:8000:gotJpdaAddressif not "%JPDA_SUSPEND%" == "" goto gotJpdaSuspendset JPDA_SUSPEND=n:gotJpdaSuspendif not "%JPDA_OPTS%" == "" goto gotJpdaOptsset JPDA_OPTS=-agentlib:jdwp=transport=%JPDA_TRANSPORT%,address=%JPDA_ADDRESS%,server=y,suspend=%JPDA_SUSPEND%:gotJpdaOptsshift:noJpda
好像直接从第一行跳到了最后一行, 没错, 一般我没启动的时候没有加 jpda 参数的话, 这里会直接跳过, 里面的脚本是关于 JPDA 的设置等.
第十一段脚本代码
if ""%1"" == ""debug"" goto doDebugif ""%1"" == ""run"" goto doRunif ""%1"" == ""start"" goto doStartif ""%1"" == ""stop"" goto doStopif ""%1"" == ""configtest"" goto doConfigTestif ""%1"" == ""version"" goto doVersionecho Usage: catalina ( commands ... )echo commands:echo debug Start Catalina in a debuggerecho debug -security Debug Catalina with a security managerecho jpda start Start Catalina under JPDA debuggerecho run Start Catalina in the current windowecho run -security Start in the current window with security managerecho start Start Catalina in a separate windowecho start -security Start in a separate window with security managerecho stop Stop Catalinaecho configtest Run a basic syntax check on server.xmlecho version What version of tomcat are you running?goto end
好似一个 switch 开关.
如果我们用 startup.bat 启动 Tomcat 的话, 这里的 "%1" 的值是 start如果通过 catalina.bat run 启动 Tomcat 的话, 这里的 "%1" 的值是 run
第十二段脚本代码
:doRunshiftif not ""%1"" == ""-security"" goto execCmdshiftecho Using Security Managerset "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"goto execCmd:doStartshiftif "%TITLE%" == "" set TITLE=Tomcatset _EXECJAVA=start "%TITLE%" %_RUNJAVA%if not ""%1"" == ""-security"" goto execCmdshiftecho Using Security Managerset "SECURITY_POLICY_FILE=%CATALINA_BASE%\conf\catalina.policy"goto execCmd
首先分析一下其中的两个 shift 命令 第一个 shift 是把 start 或者 run 参数移除, 然后下面 还是利用 "%1" 来取参数, 这时候, 取出来的就是参数列表中的第二个. 第二个 shift 是在第二个参数移除掉.
我们再来比较一下 start 和 run 的启动区别.
差别
if "%TITLE%" == "" set TITLE=Tomcatset _EXECJAVA=start "%TITLE%" %_RUNJAVA%
如果是 startup.bat 脚本启动的话, 会启动一个新的 cmd 窗口, 并且把 cmd 的 title 设置为 Tomcat.如果是 catalina.bat run 启动的话, 不会新建 cmd 窗口, 也不会设置 cmd 的 title.
最后都跳到了 execCmd 标签处.
第十三段脚本代码
:execCmdrem Get remaining unshifted command line arguments and save them in theset CMD_LINE_ARGS=:setArgsif ""%1""=="""" goto doneSetArgsset CMD_LINE_ARGS=%CMD_LINE_ARGS% %1shiftgoto setArgs:doneSetArgs
这里还是利用 "%1" 来取出启动命令之后的参数, 如果存的话, 追加到 CMD_LINE_ARGS 环境变量上, 并把这个参数移除. 通常情况下, 我们这里是不会有什么参数了, -security 这个参数我们都不会追加.
继续往下走.
第十四段脚本代码
rem Execute Java with the applicable propertiesif not "%JPDA%" == "" goto doJpdaif not "%SECURITY_POLICY_FILE%" == "" goto doSecurity%_EXECJAVA% %JAVA_OPTS% %CATALINA_OPTS% %DEBUG_OPTS% -Djava.endorsed.dirs="%JAVA_ENDORSED_DIRS%" -classpath "%CLASSPATH%" -Dcatalina.base="%CATALINA_BASE%" -Dcatalina.home="%CATALINA_HOME%" -Djava.io.tmpdir="%CATALINA_TMPDIR%" %MAINCLASS% %CMD_LINE_ARGS% %ACTION%goto end
很明显, 我们的 %JPDA% 没有值, 不会跳转; 由于我们没有加 -security 参数, 所以 %SECURITY_POLICY_FILE% 没有值, 不会跳转.
下面这段长命令就是来启动 BootStrap 类, 并把相应的参数传进去.
只要把对应的环境变量替换为它们的值, 就可以解析出这个长命令的内容. 相信你可以的. Be patient!
总结一下
首先判断一下用户直接使用 catalina.bat run 来启动 Tocmat设置 CATALINA_HOME 和 CATALINA_BASE 环境变量值验证 CATALINA_HOME 和 CATALINA_BASE 环境变量值的正确性调用 setnv.bat 脚本调用 setclasspath.bat 脚本添加 bootstrap.jar 和 tomcat-juli.jar 到 CLASSPATH 中设置 CATALINA_TMPDIR 临时目录的值为 Tomcat 目录下的 temp追加一系列的参数到 JAVA_OPTS 中整合相关的启动信息, 参数启动 Tomcat
标签:
相关推荐:
精彩放送:
- []短讯!奥飞数据:公司主要是为包括您陈述的应用在内的互利网应用、算力服务等提供数据中心及相关服务
- []每日看点!狂野西部排名:前3大局已定,第6才是香饽饽,西部黑马强势崛起
- []深入了解「化妆大师」毛戈平IPO之路,销售额达16.8亿
- []晶科能源发布全新一代SunGiga液冷工商业储能解决方案
- []当前头条:*ST科华:公司目前无霍乱检测试剂
- []观速讯丨大金重工:截至2023年3月20日,公司股东户数为96655户
- []太意外!这类QDII基金逆势上涨 竟是银行爆雷“助攻”?这只股票“带飞”多只产品
- []世界即时:市净率一般多少为好股票
- []世界视讯!瞪羚企业是什么意思
- []世界快消息!悬崖“蹦迪”?看着都怕……
- []天天日报丨振华重工股票为什么涨不起来
- []体温枪测体温哪个部位最准确
- []系统性风险可以规避吗
- []【天天报资讯】广东惠州6.2亿元成交2宗商住地 创维、城发各拿1宗
- []午评:沪指弱势下探跌约1%,金融、地产等板块走弱,CXO概念逆市活跃
- []【当前独家】k线红三兵是什么意思?这篇文章告诉你
- []每日讯息!裙楼和塔楼在图纸上如何区分?这篇文章告诉你
- []焦点快播:apart是什么意思?apart的用法介绍
- []焦点快播:凛字怎样组词?凛字的相关组词有哪些?
- []世界观速讯丨tencentfiles可以删除?tencentfiles可以转移到d盘吗?
- []【天天新要闻】中国金茂拟6.5亿元挂牌转让与阳光城合资项目公司50%股权
- []全球百事通!保利27.67亿元摘得西安高新丝路软件城118.8亩住宅地 溢价率14.91%
- []黑锋骑士团声望怎么刷最快?黑锋骑士团声望怎么开启?
- []每日动态!消石灰是啥?氢氧化钙在哪里?
- []《盗墓笔记》中陈皮阿四怎么活下来的?
- []前沿热点:郑恩地在韩国有多火?韩国女团人气排第二
- []【全球新视野】爱奇艺会员最多允许几个人使用?如何进行账号共享?
- []当前信息:锐新科技:公司产品电力电子散热器可用于通讯行业
- []环球观焦点:hurry up是什么意思?hurry up的中文解释
- []当前关注:拼多多预售可以取消吗?拼多多预售怎么取消?
- []环球快消息!乜怎么读?乜的拼音是什么?乜字详情介绍
- []观速讯丨金鹰商贸集团涨超9% 7-Eleven便利店门店数量增至121家
- []精彩看点:如何发微信到朋友圈?详细方法步骤如下
- []vicious是什么意思?vicious的用法有哪些?
- []ipod和iphone有什么区别?iPod和iPhone区别介绍
- []世界微头条丨ps磨皮有哪些技巧?ps手工磨皮教程
- []世界即时:关于回文诗有哪些?回文诗的相关内容介绍
- []电脑中qqmgr_docpro是什么东西?qqpcmgr docpro是什么文件?
- []溧阳安置房7.35亿元ABS项目更新至“已反馈”
- []中国广核:台山1号机组是按照年度大修计划开展年度换料大修
- []今日观点!铅酸电池和锂电池哪个好?铅酸电池和锂蓄电池的区别
- []戴尔笔记本电脑多少钱?戴尔笔记本电脑报价及图片
- []课外常识:评价用英文怎么说?评价英语说法
- []【聚看点】电脑小常识之电脑硬件教程 计算机硬件的最基础知识
- []热门:五猖会的主要内容是什么?五猖会主要内容介绍
- []天天观速讯丨美图秀秀app漫画特效在哪?漫画滤镜使用教程
- []全球今日讯!U盘数据丢失了怎么办?恢复数据的详细步骤在这里
- []关于岩石的分类及其特点 你了解多少?
- []互联网应用接入QQ登录时如何获取codehttps?QQ互联申请攻略
- []世界微速讯:学习web前端后发展前景怎么样?薪资变化趋势如何?
- []焦点要闻:vr视频怎么看?准备工具有哪些?VR眼镜怎么用?
- []天天速递!软件测试活动中如何做好测试报告?软件测试用例优秀例子
- []【速看料】如何在淘宝上挖掘关键词?淘宝选关键词的六种方法
- []硫酸铝化学式怎么写?硫酸铝的用途
- []环球速读:toto智能坐便器有哪些型号?toto智能坐便器型号介绍
- []每日焦点!兰博基尼Antares怎么样?兰博基尼Antares评测
- []环球新消息丨Autorun.inf Autorun.inf进程是什么?Autorun.inf病毒到底能干什么?
- []天天热讯:阿里旺旺有什么功能?阿里旺旺7.10.08C官方版软件下载
- []全球新资讯:梅王王云山是不是中国著名画家?王云山个人资料介绍?
- []硕思闪客精灵怎么导出flash(gif)动画?flash游戏源文件疑难问题解答
- []环球新资讯:bak文件怎么打开?cad文件被误删了怎么办?
- []当前热议!三星3650怎么刷机?三星S3650C刷机教程
- []江南水乡有名的古镇有哪些?江南六大古镇资料介绍?
- []颈椎按摩器品牌排行如何选购?颈椎按摩器品牌排行详情介绍
- []全球今热点:数据驱动时代如何做数据分析?一次完整的数据分析流程是什么?
- []地下城与勇士缔造者刷图怎么加点?地下城与勇士缔造者刷图加点攻略
- []世界最资讯丨缅甸为什么叫掸邦?掸邦位于哪里?
- []当前消息!休闲娱乐体育项目有哪些?健身健美类休闲活动介绍?
- []天天通讯!阿弥陀佛是什么意思?佛教语有哪些?
- []环球今日报丨电动车的锂电和航模的锂电池有什么区别?航模电池基本使用及保养
- []【全球快播报】为什么手机显示移动4g?上网还是很慢?
- []今日热门!10股转增4股是利好还是利空
- []全球短讯!生产流水线有什么好处?生产流水线的好处是什么?
- []网络攻击和攻击背后的组织是怎样的?九大全球网络攻击实时追踪系统盘点
- []诺基亚c7最新报价是多少?诺基亚c7最新报价参考
- []粉色罪孽的演员有哪些?粉色罪孽的演员资料介绍?
- []【linux】linux下iso文件的制做与解压
- []车贷可以提前还款吗
- []视焦点讯!Linux系统如何架设石器私服?Linux系统架设石器私服教程
- []世界快消息!js基础知识:Promise链式调用
- []当前头条:华硕N550笔记本内部做工如何?华硕N550笔记本拆解
- []世界热消息:工银瑞信添益快线货币有风险吗
- []什么品牌的净水器好?摩恩达净水器推荐
- []【焦点热闻】ipad怎么分屏方法?profile之springboot-maven解决方案
- []世界实时:机械设计制造类是什么专业?机械设计制造类主要课程有哪些?
- []快讯:松下KX-MB778CN多功能一体机驱动程序安装教程
- []【华为G520-T10刷机包下载】官方最新升级
- []每日快讯!淘宝试用平台还能操作吗?怎么操作才安全?
- []全球速读:广东清远:国内首条磁浮旅游专线首车正式上线
- []精心收藏风林火山系统怎么下载?风林火山win764位旗舰版安装教程
- []maven(三)最详细的profile的使用
- []世界简讯:股市交易时间和规则111
- []热点评!为什么要进行信息检索?信息检索的本质
- []电脑怎么安装xp系统安装版?安装教程来了
- []天天热讯:市盈率高好还是低好
- []每日时讯!摄像头码率是什么意思?摄像头码率性能怎样?
- []地球水体的比例是多少?水域占地球表面积约多少比率?
- []【世界报资讯】收到这类快递,赶紧扔!多地警方预警
- []【环球报资讯】华懋瑜一第1C期首张价单推80伙
- []【世界新要闻】晋控电力:公司有储能项目的前期工作,公司新能源方面在运风电项目11个,光伏项目28个
- 当前快报:DVR监控软件 V1.0基本参数介绍 DVR监控软件 V1.0安装方法
- 微头条丨成像系统设计中的激光扫描系统——多重组态
- 世界速递!catalina.bat脚本启动Tomcat源码分析
- 中海宏洋2022年新购土地楼面面积221.25万平方米 总代价101.5亿元
- 每日看点!招行副行长:招行房地产行业风险大概率在今年会基本出清
- 今日精选:深圳商务局:到2025年直播电商销售额目标超3000亿元以上
- 微头条丨家联科技:公司主要的竞争对手有美国SOLO Cup Company、富岭科技股份有限公司等
- 中国海外宏洋集团:2022年归属股东净利润31.5亿元
- 全球快看点丨北京甲级写字楼租户普查三年演变:CBD和丽泽各居最具吸引力和最具成长性商务区
- 一张图:黄金原油外汇股指"枢纽点+多空占比"一览(2023/03/27周一)
- 环球热推荐:陕西顺驰建工施工不规范被处罚 涉及项目为北京山水汇豪苑
- 焦点信息:香港机场2月客运量飙升24倍
- 今日报丨成飞集成:公司已预约4月28日发布一季度报告
- 中复神鹰:2022年归母净利同比上涨117% 碳纤维龙头持续受益国产替代
- 视焦点讯!常青科技:发行价估值偏低 高分子新材料特种单体领先企业或受追捧
- 天津津南城投完成发行8.8亿元超短期融资券 利率7.45%
- 当前速读:新疆交建:该项目不属于公司主营业务范围
- 快讯:首旅集团20亿元中期票据将付息 利率4.30%
- 全球时讯:撤退性出血是什么颜色
- 【天天报资讯】股票20日均线怎么看
- 今日观点!新航季开启,国际机票不再“又贵又难买”了吧?
- 环球最新:五星级酒店高薪抢人:入职5天可预支工资,万豪希尔顿服务员月薪可过万
- 环球速递!蓝筹股是啥意思
- 全球今日讯!牛市熊市什么意思
- 全球球精选!海航航空集团夏航季计划恢复、新开66条国际及地区航线
- 天天基金的钱取不出来怎么办
- 三盛控股:由于2021年报及2022中报仍未刊发 将延迟刊发2022年报
- 主动式负载平衡器说明书的封面_主动式负载平衡器
- 当前关注:正海磁材:公司的发展战略及经营计划敬请关注公司将于3月28日披露的《2022年年度报告》相关内容
- 热点在线丨成都兴城人居15亿元公司债将付息 利率4.27%
- 瑞丰银行50亿元可转债收问询函 要求说明不良贷款划分是否真实谨慎
- 当前观点:航天动力:公司产业技术源于航天液体火箭发动机的技术应用产业,产品主要涉及民用领域,军品业务占比较低
- 央行全面降准0.25个百分点 预计释放5500亿元中长期资金
- 环球最资讯丨宝丰能源:2022年公司出口定制LLDPE9047H、PPHP500L两个产品,填补了国内空白
- 天天新动态:深圳龙岗:平湖跨境电商产业园正式开工 计划2025年建成交付
- 世界热讯:东北证券:复盘美国的七次衰退 带给了我们哪些启示?
- 人工智能频现牛股 基金经理欲罢不能
- 焦点资讯:筹码集中度高好还是低好
- 观速讯丨今年来平均回报超44% 游戏主题ETF“霸榜”
- 年报解读 | 城投控股2022年营收下降7.88%至84.68亿元,扣非归母净利上市以来首亏
- 全球最资讯丨恒源煤电:根据上市公司信息披露相关准则,公司会在定期报告中披露报告期末股东人数等信息
- 环球观天下!碳酸锂价格腰斩逼近成本线 产业链期盼需求回暖
- 环球今头条!巴比食品:截止3月10日,公司股东总人数(户)约为1万
- 广东:前2月社会消费品零售总额0.79万亿元 同比增长1.8%
- 【世界时快讯】龙洲股份:您的提问请查阅我们之前的
- 世界视讯!年报解读| 绿城服务:2022年收入同比增长18.2% 权益股东应占溢利同比下降35.3%
- 世界今日报丨年报解读 | SOHO中国2022年由亏转盈,违约事件得到解决,将继续出售若干商业物业
- 博旧改?佛山多个老旧农村自建房遭哄抢,溢价率达到惊人的434%!
- 环球微头条丨社会工作者考试成绩查询时间(社会工作者考试成绩查询)
- 天天微速讯:邯郸市望源房地产开发85%股权挂牌转让 底价1.1亿元
- 全球热门:明勤挂牌转让泉州振贸房产50%股权 底价6.5亿元
- 焦点速递!TD早报 | Expedia等平台成为ChatGPT插件功能第一批启用者;万豪迎来亚太地区第1000家酒店开业里程碑
- 当前动态:润滑剂是否会对身体造成伤害?能否长期用!使用前须知
- 焦点短讯!学平险猫抓狗咬能报销多少钱,根据实际的产品而定
- 新华保险的康健华尊和康健华贵B的区别
- 全球即时看!珍酒李渡集团通过港交所聆讯 2022年收入585.59亿元
- 当前头条:车辆必买的4个险,车险购买方法
- 今日视点:香格里拉2022年收入14.62亿美元 归母综合亏损1.59亿美元
- 全球速看:保险公司一年存2万存10年,一般是没有问题的
- 世界热点评!保险可以提前多久续保
- 今日最新!石器世界
- 瑞安建业2022年营收63.07亿港元 归母净亏损2.32亿港元
- 沃森生物:股份回购需要结合公司发展和市场情况,严格履行上市公司规范运作程序进行决策
- 全球最新:丽新发展中期收入24.67亿港元 归母净亏损扩大至13.6亿港元
- 短讯!丹寨县党建引领“五抓五不误”抓实农业生产
- 复星旅文2022年收入137.78亿元 归母亏损缩窄至5.45亿元
- 天天热点!115元保险怎么买
- 今日热闻!互惠保险怎么买
- 全球观热点:过渡性养老金是什么意思
- 养老一年交7000能领多少,交养老金的好处
- 每日时讯!行人被车撞死了应该赔偿多少钱
- 讯息:个人交养老保险价格表,有以下2种
- 财信地产控股股东转让1.57亿股上市公司股份 套现约9.2亿元
- 焦点报道:个人保险买什么最好,分以下两种情况
- 个人养老保险缴费明细,查询方式有以下4种
- 公积金错缴能退回吗
- 全球百事通!人社部取消女干部和女工人,是真是假
- 阿特斯在科创板注册生效:计划募资40亿元,比亚迪等为股东
- 实时:2022年补缴社保的最新政策,暂未发布
- 保险返点是什么意思怎么返点
- 保险一年交多少钱,视车型而定
- 环球热资讯!商业险和三者险有啥区别
- 【世界热闻】社保最多可以停几个月,没有具体的规定
- 世界消息!外高桥35亿元定增申请获上交所受理
- 全球看点:福星股份13.4亿元定增事项收到深交所审核问询函
- 世界播报:黄冈人力资源与社会保障局(黄冈人力资源与社会保障局)
- 复星集团宣布将在青岛投资建设亚特兰蒂斯文旅项目
- 当前资讯!高送转一般在几月
- 环球精选!四上企业什么意思
- 美联储加息对a股的影响
- 视焦点讯!家乡是我前进的动力,从非洲难民到NBA球员的加布里埃尔!
- 环球热点评!MACD指标的优缺点
- 消息!沪股通增持股票意味着什么
- 世界热头条丨量比多少是最佳买入点
- 世界聚焦:神首集团是正规公司吗
- 世界视点!10送10股是什么意思
- 头条焦点:郑州公积金新政:全面开展提取住房公积金按期付房租业务
- 双方父母初次见面忌讳
- 中泰策略:如何把握创业板反弹的驱动与主线?
- 热门看点:股票期权是什么意思
- 每日热闻!两大趋势深刻影响MICE行业;在途商旅接入飞猪 | 一周商旅动态
- 今日看点:股票压力位什么意思
- 同程旅行发布2022年财报 ;开始回血的航司为什么还要“随心飞”? | 一周速览
- 股票不能卖出怎么回事
- 退市的股票股民有赔偿吗
- 当前视点!【光与夜之恋同人】(陆沉)千年之恋⑥
- 全球即时:股东减持是什么意思
- 高净值人群什么意思
- 微资讯!美股为何大跌
- 天天快消息!新股会破发吗