1 解释

java project  我说的是main方法作为程序入口的java工程,有别于 web project。

这样的工程 一般都是web project的附属扫描程序或一些独立的执行程序,如数据同步程序等。
     把这样的project 要部署到生产机上去运行,这样就涉及到两个问题: 
        1 打包问题,我们一般不会把整个工程文件夹给放上去,一般做法是打一个jar包。
        2 执行问题  最好的做法就是这些main方法程序的工程 对客户来说是透明的 就要求工程 发布成windows 的一个服务。并且设置成一 个自动启动的服务。

2 java project打包解决方案

我们做java project 的开发环境一般是Eclipse,这个开发环境本身就提供了把java project 打包成Jar file的功能。
菜单 File--->Export 选择相应的java project 设置相应的main方法类 按照向导就可以轻松完成。
但这里有一个很大的不足,就是支持这个java project 正常运行的第三方jar包没有被打进来。 这个打成的jar包是不能直接运行的。
      现在实施时,比较常用的解决方案是 依靠第三方的打包插件来实现打包。比较好的开源插件为 fatjar 
      下载地址 http://sourceforge.net/projects/fjep/files
      在eclipse中安装好这个插件后,就可以直接用这个插件进行打包,生成 jar文件。
命令中运行这个jar文件。如果想执行jar文件,可以使用java命令的-jar选项。例如,你有一个可以运行的myjar.jar文件。因为该文件是可以执行的,所以你可以用如下命令执行之:java -jar myjar.jar 就可以看到执行效果。

3 java project 的下一站windows服务

把java project 打成可以执行的jar后,并没有结束。
我们不能要求客户关机再开机的时候 让他们去进行 java -jar java -jar myjar.jar 的命令操作  或
双击可执行jar包的方式来 启动独立运行的java project 程序,我们应该把这个程序的启动做到客户透明化。
可以做的就是开机,开机后,一切业务程序就可以自动运行。

4 一个windows的服务的解决方案

比较多的解决方案是 使用 wrapper-windows 这个软件包。这个软件包的强大之处是能把jre环境也给打进去,这个服务可以正常运行在根本没有jre环境即就没有安装JDK的机器上。
    当然我也是比较喜欢 不把jre环境打到服务里的方式,服务程序的运行依靠本机上安装的的jre环境。
        1  下载wrapper-windows-x86-32-3.2.3版本,并解压。里面包含 bin conf doc jdoc lib logs src 7个文件夹。
        2  新建一个文件夹  如 命名为 myWindowServ,在此文件夹下建立 lib bin conf logs application 5个子文件夹。
        3 将 wrapper-windows\src\bin 下的
                    App.bat.in
                    InstallApp-NT.bat.in
                    PauseApp-NT.bat.in
                    ResumeApp-NT.bat.in
                   StartApp-NT.bat.in
                   StopApp-NT.bat.in
                   UninstallApp-NT.bat.in
          复制到bin目录下,并将后缀为.in的文件全部重命名,去掉.in。例如: App.bat.in重命名为App.bat,
          并将wrapper-windows\bin下的wrapper.exe也复制到bin目录下。
       4 将 wrapper-windows\conf 下的文件复制到myWindowServ\conf目录下。
       5 将 wrapper-windows\log  下的文件复制到myWindowServ\logs目录下。
       6 将 wrapper-windows\lib   下的文件复制到myWindowServ\lib目录下。
       7 将需要安装成服务的java程序打包成jar文件(例如 上面的打包文件 myjar.jar)放到myWindowServ\application下。
       8 配置新文件夹conf目录下的wrapper.conf文件,可以配置运行环境,执行程序,堆内存大小,服务名称等属性信息。
              这里仅仅列出需要修改和需要注意的地方
                   8.1 找到wrapper.java.command=java
                           如果本机已配置了jre,那么此项不需更改;否则的话,需要将jre复制到myWindowServ文件夹路径下
                        (如和bin在 同一级,修改wrapper.java.command=../jre/bin/java.exe)
                   8.2 指定wrapper的启动方式,用wrapper代理启动不容易出现问题,不然 老报test.Main不存在的异常。
                           wrapper.java.mainclass=org.tanukisoftware.wrapper.test.Main
                           修改成
                           wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
                  8.3  将程序运行需要的jar包都列出来 lib文件夹中的wrapper.jar是必需的
                          wrapper.java.classpath.1=../lib/wrapper.jar
                          wrapper.java.classpath.2=../application/myjar.jar
                  8.4 配置程序运行的所需要的内存大小
                           # Initial Java Heap Size (in MB)
                           #wrapper.java.initmemory=3
                           # Maximum Java Heap Size (in MB)
                           #wrapper.java.maxmemory=64
                          修改成
                          # Initial Java Heap Size (in MB)
                             wrapper.java.initmemory=128
                          # Maximum Java Heap Size (in MB)
                             wrapper.java.maxmemory=256
                          这里是限制服务所占用的最小和最大内存,根据程序运行的效果也可以不改。
                  8.5 指定程序的主类

如 com.weiguo.mypro.TimerRun 是 myJar打包工程中main方法所在的类,

就需要如下配置:
                          wrapper.app.parameter.1=com.weiguo.mypro.TimerRun

以下的一些设置 就是服务本身的属性设置,可以 设置---控制面板--管理工具--服务--随便选中一个服务--右键属性看到。

8.6 控制台运行时的名称
                           wrapper.console.title=TestServer
                  8.7 指定服务的名称
                          wrapper.ntservice.name=TestServer
                  8.8  windows服务的显示名称
                          wrapper.ntservice.displayname=TestServer
                  8.9 服务描述
                          wrapper.ntservice.description=TestServer描述
                  8.10 启动模式,默认是自启动AUTO_START or DEMAND_START
                         wrapper.ntservice.starttype=AUTO_START
        9  运行InstallApp-NT.bat安装服务,运行StartApp-NT.bat启动服务。
       10 可以暂停,重启服务 停止服务 PauseApp-NT.bat ResumeApp-NT.bat StopApp-NT.bat
       11 如果要卸载这个服务的话,运行UninstallApp-NT.bat卸载服务。

另外一个解释

Java Service
Wrapper功能很强大,同时支持Windows及Un*x平台,提供三种方式把你的Java程序包装成系统服务,这里只介绍最简单的一种方式,因这种
方式无需对已有的服务程序作任何改变,仅仅增加几个script、配置文件就可以把你的Java服务程序改造成系统服务程序了。
当然在使用之前需要到 http://wrapper.tanukisoftware.com/doc/english/download.jsp下载
Service Wrapper的发布包。

下面简单介绍一下具体的使用步骤:
1.  将下载的Java Service Wrapper包解压到本地,目录为{WRAPPER_HOME};
2.  服务应用程序名为MyServApp,在目录d:\MyServApp下建立bin、conf、logs、lib目录;并把你的已有应用程序如NioBlockingServer.class拷贝到该目录下;
3.  将{WRAPPER_HOME}\src\bin\下的遗以下文件拷贝到MyServApp目录下,并重命名。
 C:\ MyServApp\bin\Wrapper.exeà{WRAPPER_HOME}\bin\Wrapper.exe 
 C:\MyServApp\bin\MyApp.batà{WRAPPER_HOME}\src\bin\App.bat.in
 C:\MyServApp\bin\InstallMyApp-NT.batà{WRAPPER_HOME}\src\bin\InstallApp-NT.bat.in
 C:\MyServApp\bin\UninstallMyApp-NT.batà{WRAPPER_HOME}\src\bin\UninstallApp-NT.bat.in
4.  将{WRAPPER_HOME}\lib下的以下文件拷贝到C:\ MyServApp \lib目录下
{WRAPPER_HOME}\lib\Wrapper.DLL
{WRAPPER_HOME}\lib\wrapper.jar
5.  将{WRAPPER_HOME}\src\conf\wrapper.conf.in拷贝到C:\ MyServApp \conf目录下并命名为wrapper.conf;并修改wrapper.conf文件,在其中配置您的应用服务。
主要修改以下几项即可:
#你的JVM位置:
wrapper.java.command=D:\Sun\j2sdk1.4.0_03\bin\java 
#运行参数:如:
wrapper.java.additional.1=-Dprogram.name=run.bat
#classpath:
wrapper.java.classpath.1=../lib/wrapper.jar
wrapper.java.classpath.2=../bin/.
# Java Library Path (location of Wrapper.DLL orlibwrapper.so)
wrapper.java.library.path.1=../lib
#MAIN CLASS 此处决定了使用Java Service Wrapper的方式
wrapper.java.mainclass=org.tanukisoftware.wrapper.WrapperSimpleApp
#你的Java应用类
wrapper.app.parameter.1= NonBlockingServer
# 服务名
wrapper.ntservice.name=NB

# Display name of the service
wrapper.ntservice.displayname=Nio NonblockingServer
# 服务描述
wrapper.ntservice.description=Nio NonblockingServer
其他的配置根据你的需要改变即可
6.  对以上配置的MyApp.bat进行测试,运行MyApp.bat,就像在Console窗口下运行Tomcat一样;
7.  对以上配置的服务进行测试,运行C:\MyServApp\bin\InstallMyApp-NT.bat将把你的应用(此处为NioBlockingServer)安装到Win32系统服务中了。
8.  打开控制面板-管理程序-服务,看到Nio Nonblocking Server已经在系统服务中了,其他用法就与我们熟悉的Windows服务一样了。

Tomcat使用的是Java Service
Wrapper模式二,这种方式需要对已有的程序进行小的改动,但可以通过Socket端口的方式控制服务程序核心的启动,更加灵活。Java
Service Wrapper提供的模式三比较复杂,需要作出更多的编码,我没有研究。
采用模式一,即可简单有效的把我们的服务程序包装成为系统服务程序,并增强了日志功能,我们可以把MyServApp的几个文件做成模板,每次修改文件名,配置文件就可以了,有精力的朋友更可以做成Eclipse的plugin,鼠标点点就把应用配成服务了。

追问:

刚才我也下了个wrapper-windows-x86-32-3.2.3.zip  说下具体用法行吗?

InstallTestWrapper-NT.bat执行这个可以成功安装,

UninstallTestWrapper-NT.bat执行这个可以成功卸载。

但是怎么把Test Wrapper Sample Application服务换成我写的java程序呢?

求具体方法。。。。求指教!

回答:
并把你的已有应用程序如NioBlockingServer.class拷贝到该目录下
追问:

wrapper.exe <command> <configuration file> [configuration properties] [...]
wrapper.exe <configuration file> [configuration properties] [...]
   (<command> implicitly '-c')
wrapper.exe <command>
   (<configuration file> implicitly 'wrapper.conf')
wrapper.exe
   (<command> implicitly '-c' and <configuration file> 'wrapper.conf')

这个命令有什么用?

追问:

装完的服务,可执行文件的路径是这个

C:\WRAPPER_HOME\bin\wrapper.exe -s C:\WRAPPER_HOME\conf\wrapper.conf

比如我想改成c:\123.exe

要怎么改呢!

回答:
1.   准备工具

首先下载Java Service Wrapper

2.   准备代码

要使用Java Service Wrapper,自己原有的程序必须进行一次改造或者添加一个包装类。这里使用一个最简单的HelloWorld类作为示例。

package com.yjw;

import javax.swing.JFrame;

import javax.swing.JLabel;

import org.tanukisoftware.wrapper.WrapperListener;

import org.tanukisoftware.wrapper.WrapperManager;

// 实现WrapperListener接口

public class HelloWorld implements   WrapperListener{

private static void createAndShowGUI() {

JFrame.setDefaultLookAndFeelDecorated(true);

JFrame frame = new JFrame("HelloWorldSwing");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

JLabel label = new JLabel("Hello World");

frame.getContentPane().add(label);

frame.setSize(150, 100);

frame.setVisible(true);

}

public static void main(String[] args) {

javax.swing.SwingUtilities.invokeLater(new Runnable() {

public void run() {

createAndShowGUI();

}

});

//这里,启动HelloWold

WrapperManager.start(   new   HelloWorld(),   args   );

}

//需要一个start方法

public Integer start(String[] args) {

System.out.println("start()");

try {

System.out.println("HelloWorld!");

catch (Exception e) {

}

return null;

}

//需要一个stop方法

public int stop(int exitCode) {

System.out.println("stop(" + exitCode + ")");

return exitCode;

}

//需要一个controlEvent方法

public void controlEvent(int event) {

System.out.println("controlEvent(" + event + ")");

}

}

这里,直接把入口类进行了代码改造,用户也可以单独写一个包装类,把上面带注释的四个地方的代码提取出来,对自己原来的入口类进行包装。

注意:如果没有对入口类进行java wrapper service需要的代码改造,则在做成服务后,表现为JVM试图不停地启动服务,查看wrapper.log,会发现类似如下的报错:

INFO       |   wrapper     |   2010/04/16   21:24:58   |   Waiting   to   start...   
  INFO       |   wrapper     |   2010/04/16   21:25:03   |   Waiting   to   start...   
  INFO       |   wrapper     |   2010/04/16   21:25:08   |   Waiting   to   start...   
  ERROR     |   wrapper     |   2010/04/16   21:25:29   |   Startup  
failed:   Timed   out   waiting   for   a   signal   from   the   JVM.
  
  ------------------------------------------------------------------------   
  ADVICE   |   wrapper     |   2010/04/16   21:25:29   |     
  ERROR     |   wrapper     |   2010/04/16   21:25:29   |   JVM   did   not   exit   on   request,   terminated   
  FATAL     |   wrapper     |   2010/04/16   21:25:29   |   There   were
  5   failed   launches   in   a   row,   each   lasting   less   than  
300   seconds.     Giving   up.   
  FATAL     |   wrapper     |   2010/04/16   21:25:29   |       There  
may   be   a   configuration   problem:   please   check   the   logs.
  
  STATUS   |   wrapper     |   2010/04/16   21:25:29   |   <--   Wrapper   Stopped

将HelloWorld.java打成HelloWorld.jar。

3.   实现服务

1)           准备工作区

准备一个工作文件夹,例如test,在test下新建conf,log,lib三个文件夹

2)           将下载下来的java wrapper service解压缩

a) 将Java Service Wrapper包中bin下的wrapper.exe拷贝至test下

b) 将Java Service
Wrapper包中src/bin下的App.bat.in(测试运行),InstallApp-NT.bat.in(安装windows服
务),UninstallApp-NT.bat.in(卸载windows服务)拷贝至test下,并且将后缀.in去掉

c) 修改App.bat,InstallApp-NT.bat,UninstallApp-NT.bat中的set _WRAPPER_CONF="%_REALPATH%conf\wrapper.conf"

d) 将conf文件夹下的wrapper.conf拷贝至test/conf下

e) 将Java Service Wrapper包中lib下的Wrapper.DLL,wrapper.jar拷贝至test/lib下

3)           准备可用jar包

HelloWorld.jar此时还不能直接使用,需要进行改造

a) 将HelloWorld.jar解压缩,提取META-INF/MANIFEST.MF文件

b) 打开MANIFEST.MF,在Class-Path中追加wrapper.jar wrapper.dll

c) 将HelloWorld.jar和改造过的MANIFEST.MF一起拷贝到%JAVA_HOME%/bin下

d) 打开cmd窗口,将路径切换至%JAVA_HOME%/bin

e) 输入命令jar umf MANIFEST.MF HelloWorld.jar,此时HelloWorld.jar中的MANIFEST.MF已被更新为当前的MANIFEST.MF

f)   将更新后的HelloWorld.jar拷贝至test/lib下

4)           配置wrapper.conf

打开test/conf/wrapper.conf

#程序的入口

wrapper.java.mainclass=com.yjw.HelloWorld

#程序jar,包括wrapper.jar

wrapper.java.classpath.1=lib/HelloWorld.jar

wrapper.java.classpath.2=lib/wrapper.jar

#程序的文件夹,这里为lib

wrapper.java.library.path.1=lib

#注意:有的教程注释为程序的入口,虽然能够正常运行,但是这是概念性错误!

#这个参数指传给主程序的参数入口,比如笔者有个程序,传值0表示为英文版,1为中文版,参数就在这里配置。如果有多个参数,请自行配置

#为wrapper.app.parameter.n=XXX

wrapper.app.parameter.1=1

#日志文件生成的位置

wrapper.logfile=log/wrapper.log

#windows服务所需的标题,名称,显示名和描述
wrapper.console.title=HelloWorld
wrapper.ntservice.name= HelloWorld
wrapper.ntservice.displayname= HelloWorld 
wrapper.ntservice.description= HelloWorld

5)           运行App.bat,如果没有错误出现,说明配置正常,就可以运行InstallApp-NT.bat将你的程序做成Windows服务了。所有信息都可以在log/wrapper.log日志文件里找到

6)           如果要打开调试信息,在test/conf/wrapper.conf中将wrapper.debug=TRUE前面的#号去掉即可打开调试功能

追问:

装完的服务,可执行文件的路径是这个

C:\WRAPPER_HOME\bin\wrapper.exe -s C:\WRAPPER_HOME\conf\wrapper.conf

比如我想改成c:\123.jar

要怎么改呢

回答:

#程序的入口

wrapper.java.mainclass=执行的类名

#程序jar,包括wrapper.jar

wrapper.java.classpath.1=C:/123.jar

追问:

wrapper.java.classpath.1=C:/123.jar服务安装了。。。不能启动

一直显示wrapper  | Waiting to start...

最后就关闭了!

回答:
程序需要改写,实现WrapperListener接口
追问:

能简单给个例子么 比如开机显示hello world  对接口不这么熟悉  谢谢了

回答:
上面不是给了吗
追问:
.....上面给的不对。。。。。运行不了。。。。不能启动服务
回答:

上面只是例子,你的类要implements   WrapperListener,然后public Integer start(String[] args) {

实现start,stop,controlEvent这三个方法。

追问:

没弄过这个。。。。能给个具体的代码不。。。整段的

回答:

import java.io.*;

importorg.tanukisoftware.wrapper.WrapperListener;

importorg.tanukisoftware.wrapper.WrapperManager;

public class Server1 implementsWrapperListener

{

publicstatic void main(String[] args)

{

System.out.println(   "Initializing... "   );

WrapperManager.start(newServer1(),args);

}

//实现start方法

public Integer start(String[] args) {

System.out.println("start()");

try {

System.out.println("Hello,World!");

} catch (Exception e) {

}

return null;

}

//实现stop方法

public int stop(int exitCode) {

System.out.println("stop(" + exitCode + ")");

return exitCode;

}

//实现controlEvent方法

public void controlEvent(int event) {

System.out.println("controlEvent(" + event + ")");

}

}

追问:

Server1.java:2: 软件包 org.tanukisoftware.wrapper 不存在
import org.tanukisoftware.wrapper.WrapperListener;

。。。这玩意在哪。。。。

回答:
在wrapper.jar文件里呀,把它放到classpath里。或者用-cp指定,如:javac -cp wrapper Server.java
追问:

整体。。。。全套     完全 点。。。。行不

回答:

这些都是java基础的吧。

编译成class后最后就剩打包成jar了,

写一个manifest.mf文件,里面就两行:Main-Class: test.Test <回车> ,也就是第二行是空行。

运行jar  cvfm Server1.jar manifest.mf Server1

生成jar文件就好了

追问:
........问的不是这个。。。。javac -cp wrapper Server.java 这个不懂
回答:

cp的就是classpath的缩写。

importorg.tanukisoftware.wrapper.WrapperListener;

importorg.tanukisoftware.wrapper.WrapperManager;

这2个都是Java Service Wrap提供的类,编译的时候,必须在classpath里.

或者把wrapper.jar放在环境变量里的话,或者用javac的时候用cp参数临时指定到哪里找wrapper.jar。比如

javac -cp d:\wrapper.jar Server.java

转自:http://blog.csdn.net/kevinlifeng/article/details/9423969

java打包成window service服务[转]的更多相关文章

  1. java打包成jar,但不打包配置文件

    有时候我们做java project的时候,都会打包成jar程序,为了方便部署会加个配置文件conf/pro.properties(conf文件夹与src文件夹同级) 但是不想打包进jar.其实用ec ...

  2. [Java] Java 打包成jar包 和 解压jar包

    解压jar包 jar xf xxx.jar 打包成jar包 方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法:jar {ctxui}[vfm0Me] [jar-file] ...

  3. java打包成jar文件

    JAR包是Java中所特有一种压缩文档,其实大家就可以把它理解为.zip包.当然也是有区别的,JAR包中有一个META-INF\MANIFEST.MF文件,当你找成JAR包时,它会自动生成.JAR包是 ...

  4. Maven将java打包成jar并且运行笔记

    Maven项目打包成jar并且运行笔记 首先创建一个maven项目 运行成功后,有两种方式将项目进行打包. 第一种方式: 在IDEA编辑器中maven项目进行打包: 这里显示jar包中没有主清单属性, ...

  5. python打包成window可执行程序

    python程序可以通过python hello.py执行,但是需要安装python的解释器,并配置环境变量,打包成exe程序之后可以直接执行. 使用setup工具和py2exe可以做到这一点. 最简 ...

  6. kivy学习三:打包成window可执行文件

    根据官方文档写出如下内容,主要是为了记录自己遇到的坑! 一.打开命令行 1.win+r 2.输入CMD(没错,就是那个黑窗口就是命令行) 二.新建一个新文件夹,用来存放我们打包成的文件(这里一定要注意 ...

  7. 【Tomcat】如何注册Tomcat到Window Service服务

    对于Web项目来说,经常用的服务器就是Tomcat.但是麻烦的事是,每次都得启动一下Tomcat服务.但是,如果把Tomcat的服务注册为Windows Service服务,就可以设置为开机自动启动, ...

  8. 把spring boot发布成window Service

    一:下载Winsw, 把下载后的文件名改为你的应用如doctor.exe 二:添加xml <service> <id>doctor-api-service</id> ...

  9. java打包成可执行的jar或者exe的详细步骤

    Java程序完成以后,对于Windows操作系统,习惯总是想双击某个exe文件就可以直接运行程序,现我将一步一步的实现该过程.最终结果是:不用安装JRE环境,不用安装数据库,直接双击一个exe文件,就 ...

随机推荐

  1. 在Spark上运行WordCount程序

    1.编写程序代码如下: Wordcount.scala package Wordcount import org.apache.spark.SparkConf import org.apache.sp ...

  2. 如何重构"箭头型"代码

    本文主要起因是,一次在微博上和朋友关于嵌套好几层的if-else语句的代码重构的讨论(微博原文),在微博上大家有各式各样的问题和想法.按道理来说这些都是编程的基本功,似乎不太值得写一篇文章,不过我觉得 ...

  3. @JVM新一代的垃圾回收算法

    垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...

  4. 我所遭遇过的中间件--VTK

    我所遭遇过的中间件--VTK Vtk是我接触的第一款软件开发包,它引导我对图形学的入门.我是先学的VTK,后学的OpenGL和D3D.VTK是专为图形学开发,特点是接口清晰,好上手,又含有大量的图像处 ...

  5. WCF 添加 RESTful 支持,适用于 IIS、Winform、cmd 宿主

    You can expose the service in two different endpoints. the SOAP one can use the binding that support ...

  6. 可进可退,jQuery图片、视频、flash播放插件prettyPhoto使用记录

    一.prettyPhoto简介 prettyPhoto是一款基于jquery的轻量级的lightbox图片播放浏览插件,它不仅支持图片,还同时支持视频.flash.YouTube.iframe和aja ...

  7. C#中Serializable序列化

    序列化就是是将对象转换为容易传输的格式的过程,一般情况下转化打流文件,放入内存或者IO文件 中.例如,可以序列化一个对象,然后使用 HTTP 通过 Internet 在客户端和服务器之间传输该对象,或 ...

  8. Unity3D中的欧拉角的理解

    先贴一个图: 游戏物体的属性视图中调整的角度就是欧拉角啦.. 如果细心,就会发现,单独去调整xyz的时候它并不是按照世界坐标系中的xyz轴来实施旋转的,它表示的是旋转的欧拉角. 什么是欧拉角呢?请看这 ...

  9. 笔记本wifi热点设置好后,手机连上但不能上网问题

    这个问题我遇到过,我的原因是因为电脑上装有安全防护软件360的原因 解决方法是:打开360-->找到功能大全中的流量防火墙-->打开局域网防护-->关闭局域网隐身功能,立刻解决了这个 ...

  10. 如何使用Flash抓抓狂抓取网页Flash

    运行该软件,如果把鼠标移动到flash的部位浏览器左边顶部没有出现保存按钮,则定位到这个Flash,右击选择播放,暂停,反复一次即可看到. 把flash暂停再播放即可. 如果是QQ空间的漂亮的背景,不 ...