tomcat作为服务启动和开启startup.bat运行,程序运行结果不一样!

时间:2022-01-23 15:55:56
我最近做了一个项目,其中用到了Jacob这个包将Word文档转换为html,但是用此包进行转换需要在jdk的bin目录下加入jacob-1.18-M2-x64.dll(64位)或jacob-1.18-M2-x86.dll(32位)这两个文件,我使用MyEclipse将tomcat启动或者直接启动startup.bat程序都可以正常运行,Word也能够正常转换为html。但是这样每次启动tomcat都很不方便,所以我使用service.bat install 命令将tomcat作为服务,这样就可以设置成开机自动启动,这样一开机就可以用了,通过服务启动的tomcat确实可以正常运行,但是!唯独Word转换为html这个块出了问题!无法转换!但是我查看进程,每次运行Word转html都会新建一个叫做“WINWORD.EXE”的进程。这个实在令我诧异!为什么通过服务启动就不能使用Jacob了呢!然后我在我同学的电脑上也试了一下,跟我情况一样。(我和我同学电脑系统都是win7的)。然后我又用公司的两台xp电脑配了一次,用服务启动,Word都能正常转为html!!难道跟系统有关???这个我就有点不理解了。通过服务启动tomcat和使用startu.bat启动到底有什么区别,或者如果是系统问题,win7和xp在处理这个问题方面又有什么不一样呢??求大神帮忙解决啊!下面是Word转html的相关代码:
// 启动word应用程序(Microsoft Office Word 2003)
        ActiveXComponent app = new ActiveXComponent("Word.Application");
        System.out.println("*****正在转换...*****");
        try  
        {
         // 设置word应用程序不可见  
            app.setProperty("Visible", new Variant(false));  
            // documents表示word程序的所有文档窗口,(word是多文档应用程序)
            Dispatch docs = app.getProperty("Documents").toDispatch();  
            // 打开要转换的word文件
            Dispatch doc = Dispatch.invoke(   
                    docs,   
                    "Open",   
                    Dispatch.Method,   
                    new Object[] { docfile, new Variant(false), 
                     new Variant(true) }, new int[1]).toDispatch();   
            // 作为html格式保存到临时文件
            Dispatch.invoke(doc, "SaveAs", Dispatch.Method, new Object[] {   
                    htmlfile, new Variant(WORD_HTML) }, new int[1]);   
            // 关闭word文件
            Dispatch.call(doc, "Close", new Variant(false));   
        }   
        catch (Exception e)   
        {   
            e.printStackTrace();   
        }   
        finally  
        {   
         //关闭word应用程序
            app.invoke("Quit", new Variant[] {});   
        } 
        System.out.println("*****转换完毕********");
    }

19 个解决方案

#1


虽然看不明白,但是好像好厉害的样子,帮顶 tomcat作为服务启动和开启startup.bat运行,程序运行结果不一样!

#2


自己顶一个!!!求回复啊!

#3


难道是作为Service启动时的登录身份有问题?或者是Service起早了,Office组件还没发挥作用?

#4


引用 3 楼 yyfhz 的回复:
难道是作为Service启动时的登录身份有问题?或者是Service起早了,Office组件还没发挥作用?

应该不会是Service起早了吧,我是开机之后再手动启动的服务也不行,我想也有可能是Service启动的时候登陆身份有问题,但是具体是什么问题呢?问题又怎么解决呢?为什么有的电脑也可以呢?

#5


LZ的Service在服务窗体里能看得到吗?如果能看到,试着在登录页面中把允许服务与桌面交互勾上,或者用在登录页面中存入某一个管理员账户密码试试

#6


引用 5 楼 yyfhz 的回复:
LZ的Service在服务窗体里能看得到吗?如果能看到,试着在登录页面中把允许服务与桌面交互勾上,或者用在登录页面中存入某一个管理员账户密码试试

我照这样做了,还是不行啊!

#7


startup.bat运行的时候用的用户是你当前的用户。而服务启动的时候,用的是System用户。

以前碰到过类似问题,用服务启动的进程(Runtime.exec,Process等)时候,会挂起很长时间。后来的用了两种解决方案:
1 通过JNI启动进程
2 读取Process的inputStream(不是每种情况都有效)

至于你这个,不是很清楚具体情况。但是基本上就是我上面说的问题相关

#8


补充一下:读取process的inputstream(对于java来说是输入,对于进程来说,是输出)。另外,哪怕进程一个字节也没输出,也是有效果的。

#9


引用 7 楼 shine333 的回复:
startup.bat运行的时候用的用户是你当前的用户。而服务启动的时候,用的是System用户。

以前碰到过类似问题,用服务启动的进程(Runtime.exec,Process等)时候,会挂起很长时间。后来的用了两种解决方案:
1 通过JNI启动进程
2 读取Process的inputStream(不是每种情况都有效)

至于你这个,不是很清楚具体情况。但是基本上就是我上面说的问题相关

我在有些电脑上可以正常启动,有的电脑上不可以,为什么呢?

#10


jacob这个包可能需要windows底层的某个服务,你开机启动的话,不能保证这个需要的服务一定在你tomcat启动之前就已经运行了

#11


引用 9 楼 xiaoyehuayingwu 的回复:
我在有些电脑上可以正常启动,有的电脑上不可以,为什么呢?


到底是有的电脑用服务也很快,有的电脑用startup.bat也很慢??
还是,如我猜测的那样,慢的都是服务?

#12


楼主你的问题解决没有,我也遇到这个问题了~
求帮助啊 tomcat作为服务启动和开启startup.bat运行,程序运行结果不一样!
还有上边高手说的 
  1 通过JNI启动进程
 2 读取Process的inputStream(不是每种情况都有效)
 完全看不懂啊 - - -- - 

#13


引用 10 楼 dxqrr 的回复:
jacob这个包可能需要windows底层的某个服务,你开机启动的话,不能保证这个需要的服务一定在你tomcat启动之前就已经运行了

 这个有可能,win7 和 xp 在操作系统内置的服务方面的配置肯定略有不同,毕竟 win7 比 xp 多出了很多后台服务,谁知道它们做什么的。

另外你并没有提供当 win7 下失败后有什么错误日志,这个是关键的地方,它能提示我们错误的原因是什么。

#14


Word 转换启动 winword.exe 是正常的,这表示它是直接调用 word 的  OLE 功能,并不是自己来转换。你在 outlook 或 excel 中嵌入一个  word 文件双击word文件后就能发现除了外框看下来没变,其它从菜单到工具栏到窗口内的内容全部被替换成了 word 程序的啊。这时候 excel 只是个外壳,没有任何实际功能。

引用 13 楼 humanity 的回复:
Quote: 引用 10 楼 dxqrr 的回复:

jacob这个包可能需要windows底层的某个服务,你开机启动的话,不能保证这个需要的服务一定在你tomcat启动之前就已经运行了

 这个有可能,win7 和 xp 在操作系统内置的服务方面的配置肯定略有不同,毕竟 win7 比 xp 多出了很多后台服务,谁知道它们做什么的。

另外你并没有提供当 win7 下失败后有什么错误日志,这个是关键的地方,它能提示我们错误的原因是什么。

#15


这位大哥,请问你的问题解决了吗?我现在也遇到同样的问题,该解决啊?

#16


1、要设置Service“允许服务与桌面进行交互”
2、要设置DCOM组件的权限
命令行输入dcomcnfg(64位系统输入comexp.msc -32)
在组件服务-DOCM配置中找到Word,在属性-标识中选择“交互式用户”

#17


我尝试过#16的做法,是可以的,但前提是用户重启服务器,需要用管理员登录系统,初始化系统桌面,后面我改为让用户手动启动了。

#18


我通过tomcat 的start .bat 或myeclipse 都能实现调用打印机打印word 但是服务启动下程序运行了打印机却没反应 

#19


tomcat作为服务启动和开启startup.bat运行,程序运行结果不一样!

#1


虽然看不明白,但是好像好厉害的样子,帮顶 tomcat作为服务启动和开启startup.bat运行,程序运行结果不一样!

#2


自己顶一个!!!求回复啊!

#3


难道是作为Service启动时的登录身份有问题?或者是Service起早了,Office组件还没发挥作用?

#4


引用 3 楼 yyfhz 的回复:
难道是作为Service启动时的登录身份有问题?或者是Service起早了,Office组件还没发挥作用?

应该不会是Service起早了吧,我是开机之后再手动启动的服务也不行,我想也有可能是Service启动的时候登陆身份有问题,但是具体是什么问题呢?问题又怎么解决呢?为什么有的电脑也可以呢?

#5


LZ的Service在服务窗体里能看得到吗?如果能看到,试着在登录页面中把允许服务与桌面交互勾上,或者用在登录页面中存入某一个管理员账户密码试试

#6


引用 5 楼 yyfhz 的回复:
LZ的Service在服务窗体里能看得到吗?如果能看到,试着在登录页面中把允许服务与桌面交互勾上,或者用在登录页面中存入某一个管理员账户密码试试

我照这样做了,还是不行啊!

#7


startup.bat运行的时候用的用户是你当前的用户。而服务启动的时候,用的是System用户。

以前碰到过类似问题,用服务启动的进程(Runtime.exec,Process等)时候,会挂起很长时间。后来的用了两种解决方案:
1 通过JNI启动进程
2 读取Process的inputStream(不是每种情况都有效)

至于你这个,不是很清楚具体情况。但是基本上就是我上面说的问题相关

#8


补充一下:读取process的inputstream(对于java来说是输入,对于进程来说,是输出)。另外,哪怕进程一个字节也没输出,也是有效果的。

#9


引用 7 楼 shine333 的回复:
startup.bat运行的时候用的用户是你当前的用户。而服务启动的时候,用的是System用户。

以前碰到过类似问题,用服务启动的进程(Runtime.exec,Process等)时候,会挂起很长时间。后来的用了两种解决方案:
1 通过JNI启动进程
2 读取Process的inputStream(不是每种情况都有效)

至于你这个,不是很清楚具体情况。但是基本上就是我上面说的问题相关

我在有些电脑上可以正常启动,有的电脑上不可以,为什么呢?

#10


jacob这个包可能需要windows底层的某个服务,你开机启动的话,不能保证这个需要的服务一定在你tomcat启动之前就已经运行了

#11


引用 9 楼 xiaoyehuayingwu 的回复:
我在有些电脑上可以正常启动,有的电脑上不可以,为什么呢?


到底是有的电脑用服务也很快,有的电脑用startup.bat也很慢??
还是,如我猜测的那样,慢的都是服务?

#12


楼主你的问题解决没有,我也遇到这个问题了~
求帮助啊 tomcat作为服务启动和开启startup.bat运行,程序运行结果不一样!
还有上边高手说的 
  1 通过JNI启动进程
 2 读取Process的inputStream(不是每种情况都有效)
 完全看不懂啊 - - -- - 

#13


引用 10 楼 dxqrr 的回复:
jacob这个包可能需要windows底层的某个服务,你开机启动的话,不能保证这个需要的服务一定在你tomcat启动之前就已经运行了

 这个有可能,win7 和 xp 在操作系统内置的服务方面的配置肯定略有不同,毕竟 win7 比 xp 多出了很多后台服务,谁知道它们做什么的。

另外你并没有提供当 win7 下失败后有什么错误日志,这个是关键的地方,它能提示我们错误的原因是什么。

#14


Word 转换启动 winword.exe 是正常的,这表示它是直接调用 word 的  OLE 功能,并不是自己来转换。你在 outlook 或 excel 中嵌入一个  word 文件双击word文件后就能发现除了外框看下来没变,其它从菜单到工具栏到窗口内的内容全部被替换成了 word 程序的啊。这时候 excel 只是个外壳,没有任何实际功能。

引用 13 楼 humanity 的回复:
Quote: 引用 10 楼 dxqrr 的回复:

jacob这个包可能需要windows底层的某个服务,你开机启动的话,不能保证这个需要的服务一定在你tomcat启动之前就已经运行了

 这个有可能,win7 和 xp 在操作系统内置的服务方面的配置肯定略有不同,毕竟 win7 比 xp 多出了很多后台服务,谁知道它们做什么的。

另外你并没有提供当 win7 下失败后有什么错误日志,这个是关键的地方,它能提示我们错误的原因是什么。

#15


这位大哥,请问你的问题解决了吗?我现在也遇到同样的问题,该解决啊?

#16


1、要设置Service“允许服务与桌面进行交互”
2、要设置DCOM组件的权限
命令行输入dcomcnfg(64位系统输入comexp.msc -32)
在组件服务-DOCM配置中找到Word,在属性-标识中选择“交互式用户”

#17


我尝试过#16的做法,是可以的,但前提是用户重启服务器,需要用管理员登录系统,初始化系统桌面,后面我改为让用户手动启动了。

#18


我通过tomcat 的start .bat 或myeclipse 都能实现调用打印机打印word 但是服务启动下程序运行了打印机却没反应 

#19


tomcat作为服务启动和开启startup.bat运行,程序运行结果不一样!

#20