jacob.jar免费版是一个jar包合集,里面有jar包和dll文件,分64位和32位,不同的版本的系统使用不同的dll文件。所以如果你编译成功,但运行失败一般是dll文件问题,遇到这种情况,赶紧使用jacob.jar免费版即可。
相关软件 | 版本说明 | 下载地址 |
---|---|---|
Arthas | 官方版 | 查看 |
struts2 | 官方版 | 查看 |
Java 7 Update 67 | v7.0 | 查看 |
Myeclipse2021 | 最新版 | 查看 |
使用说明
下载并解压jacob.jar免费版
1、把dll文件放在%JAVA_HOME%bin下(注意系统是32位还是64位),也可以放在C:WindowsSystem32下,如果是64位应该放在C:WindowsSysWOW64 下。建议放在jdk的bin目录下
2、如果是在eclipse下开发,需要重新引入jdk(Preference/Java/Installed JREs)
3、开发时将jacab.jar包放在项目lib下并add到liabraries中即可。
软件功能
Jacob命令行设置
该库支持多种不同的命令行选项:dll路径位置和dll名称定制
java.library.path标准Java属性用于将jacob dll的位置添加到JVM的库路径。(添加1.11)
例: -Djava.library.path=d:/jacob/release/x86
jacob.dll.name使用自定义的名称覆盖标准DLL名称。这样可以阻止jacob使用其32位/
64位检测和dll会合逻辑。当Jacob与另一个应用程序捆绑在一起时,有时会使用该应用程序,并且应用程序希望将jacob
dll版本号与应用程序版本号进行绑定。(加1.14M7)
例: -Djacob.dll.name=MyFunkyDllName.dll
jacob.dll.name.x86和jacob.dll.name.x64用标准32位DLL名称覆盖。当Jacob与另一个应用程序捆绑在一起时,有时会使用该应用程序,并且应用程序希望将jacob
dll版本号与应用程序版本号进行绑定。(加1.14M7)
覆盖32位dll名称的示例: -Djacob.dll.name.x86=MyFunkyDllName-32bit.dll
内存管理
com.jacob.autogc确定是否启用自动垃圾回收。这是释放在事件回调中创建的对象的唯一方法。自动垃圾收集,基于Java
gc规则,垃圾回收可以通过com.java.autogc命令行选项启用 。 这个功能在版本1.9中被添加并没有被完全调试。
在每个线程的基础上管理JacobObjects的生命周期的真正原因。Jacob通常按照JacobComLifetime.html文档中的描述管理com
/ Java对象生命周期 。有些用户遇到他们希望尝试的情况,让Java
GC终身管理对象的生命周期。这似乎通常与长时间运行的线程或作为事件回调的一部分创建的对象绑定。添加了代码,让用户尝试让JVM管理对象生命周期,即使JacobComLifetime.html文档说这是一个坏主意。增加了1.9。
此值在启动时缓存,不能随时通过更改 System.setProperty();
默认值为false
例: -Dcom.jacob.autogc=false
com.jacob.includeAllClassesInROT作为主交换机和
.PutInROT。此属性确定是否(实验)PutInROT属性均匀检查。它在版本1.15中添加,因为PutInROT中的属性检查会打开applet,因为它们不允许在运行时检查系统属性。在允许的类初始化中检查com.jacob.includeAllClassesInROT。
该标志的默认值为true,与1.13之前的所有行为和1.13的默认行为相匹配
将此标志设置为false会导致Jacob检查所创建的每个Jacob对象的 .PutInROT属性。
.PutInROT让程序指定某些类的实例不能插入到ROT中。该实验(1.13)功能提供了释放在事件线程中创建的VariantViaEvent对象的机制。通常没有办法释放这些对象,因为线程终止于任何通常的MTA
/ STA启动/拆除代码之外。每个事件发生在一个新的线程中,并创建一个新的ROT条目,以便它们不受限制地增长。
此选项可能会导致VM崩溃在某些情况下,Windows内存被释放到创建的线程之外,但经验证据表明,有可能会减少处理大量事件的应用程序的长时间运行的内存占用。这个功能还是试验性的。功能增加了1.13。其中一些与com.jacob.autogc1.9中介绍的实验重叠。有关此选项的效果的示例,请参阅ROT.java测试程序。
每次都会检查该值,并可以随时更改该值 System.setProperty();
示例:System.setProperty(“com.jacob.com.VariantViaVariant.PutInROT”,”false”);
示例:-Dcom.jacob.com.VariantViaVariant.PutInROT=false
调试和故障排除
com.jacob.debug确定调试输出是否启用标准输出。
此值在启动时缓存,不能随时通过更改 System.setProperty();
默认值为false
例: -Dcom.jacob.debug=false
-XCheck:jni这将启用JVM问题的其他JVM检查。这不是一个实际的JACOB系统属性,而是JVM使用的属性。
默认值为“无附加检查”示例: -XCheck:jni
安装方法
解压后获得3个文件
jacob.jar
jacob-1.17-x64.dll
jacob-1.17-x86.dll
jacob.jar 放到项目的lib目录
win7
jacob-1.17-x64.dll 放到C:WindowsSystem32
jacob-1.17-x86.dll 放到C:WindowsSysWOW64
win7就是这么设计的, System32放64位dll,SysWOW64放32位dll,是不是很诡异。
还要注意的是,32位JDK只能加载32位DLL,64位JDK只能加载64位DLL,不能互相兼容。
还可以把jacob-1.17-x86.dll 放到jdk/jre/bin下,我选的这个
若找不到jacob.dll,会报如下错误
Exception in thread “main” java.lang.UnsatisfiedLinkError: no
jacob-1.17-x86 in java.library.path
at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1738)
at java.lang.Runtime.loadLibrary0(Runtime.java:823)
at java.lang.System.loadLibrary(System.java:1028)
at com.jacob.com.LibraryLoader.loadJacobLibrary(LibraryLoader.java:184)
at com.jacob.com.JacobObject.(JacobObject.java:107)
at MsWordEdit.(MsWordEdit.java:25)
at MsWordEdit.main(MsWordEdit.java:642)
如果不清楚java.library.path,输出一下即可。代码如下
System.out.println(System.getProperty(“java.library.path”));
使用方法
1.在项目应用中引入jar文件jacob.jar,并复制 jacob-1.15-M3-x86.dll 到windowsSystem32目录下。
2.建立好word模板文档,在文档中需要用字际值替换的地方用变量替代,例$username。
3.操作word文档工具类代码如下(部分代码):
Java代码
import org.apache.commons.lang.StringUtils;
import com.jacob.activeX.ActiveXComponent;
import com.jacob.com.Dispatch;
import com.jacob.com.Variant;
/**
* 需要用jacob-1.15-M3-x86.dll放windows/system/32下面 以及jacob.jar
*/
public class MsWordEdit{
// word文档
private Dispatch doc;
// word运行程序对象
private ActiveXComponent word;
// 所有word文档集合
private Dispatch documents;
// 选定的范围或插入点
private Dispatch selection;
private boolean saveOnExit = true;
public MsWordEdit() {
if (word == null) {
word = new ActiveXComponent(“Word.Application”);
word.setProperty(“Visible”, new Variant(false));
}
if (documents == null)
documents = word.getProperty(“Documents”).toDispatch();
}
public void moveHead(){
selection = Dispatch.get(word, “Selection”).toDispatch();
}
/**
* 设置退出时参数
*
* @param saveOnExit
* boolean true-退出时保存文件,false-退出时不保存文件
*/
public void setSaveOnExit(boolean saveOnExit) {
this.saveOnExit = saveOnExit;
}
/**
* 创建一个新的word文档
*/
public void createNewDocument() {
doc = Dispatch.call(documents, “Add”).toDispatch();
selection = Dispatch.get(word, “Selection”).toDispatch();
}
/**
* 打开一个已存在的文档
* @param docPath
*/
public void openDocument(String docPath) {
closeDocument();
doc = Dispatch.call(documents, “Open”, docPath).toDispatch();
selection = Dispatch.get(word, “Selection”).toDispatch();
}
/**
* 把选定的内容或插入点向上移动
* @param pos 移动的距离
*/
public void moveUp(int pos) {
if (selection == null)
selection = Dispatch.get(word, “Selection”).toDispatch();
for (int i = 0; i < pos; i++)
Dispatch.call(selection, “MoveUp”);
}
/**
* 把选定的内容或者插入点向下移动
* @param pos 移动的距离
*/
public void moveDown(int pos) {
if (selection == null)
selection = Dispatch.get(word, “Selection”).toDispatch();
for (int i = 0; i < pos; i++)
Dispatch.call(selection, “MoveDown”);
}
/**
常见问题
使用jacob.jar来操作Word?
使用此项目来操作Word跟你平时操作Word一样:先打开Word,内容写完后,关闭Word。在使用的过程中我们是通过书签的方式向Word里写内容的。
但在实现的过程中出现了一个问题:当我们写的内容比较多,且其拼写、语法杂乱无章时(因为是测试所以是随意复制了一些内容,没有考虑语义),在写的过程中Word会弹出一个提示对话框,提示你在打开XXX文件时,因拼写(语法)检查错误太多,无法继续显示Word。然后在在关闭Word时,Word会提示你已经弹出了一些对话框,你无法关闭Word。就这样,Word进程一直没有被结束而一直消耗着内存,而使服务器当机了。
最后的解决方案是:禁止Word的拼写、语法检查。通过Word的“工具”–>“选项”–>“拼写和语法”取消“键入时检查拼写”、“总是提出更正建议”、“键入时检查语法”、“随拼写检查主治”前的复选框,确定即可。这样,在写Word时就不会在有上述的弹出框了,也能够正常关闭Word了。
意外的收获:在我们的具体实现中,因为数据量太大,所以一开始速度比较慢,但在对Word做了上述配置后,速度几乎是提高了三倍。