用Java读取MSI文件

问题描述:

我发现如何用.Net读取MSI文件。其中一些使用Wix附带的一些库。有没有办法使用Java读取MSI数据?我想访问表格并获取文本值。用Java读取MSI文件

MSI文件是COM结构化存储。 http://en.wikipedia.org/wiki/COM_Structured_Storage

有几个选项。您可以尝试使用类似如下的方式访问它: http://poi.apache.org/poifs/index.html

您可以使用JNI访问本机MSI API。

或者,你可以掏出来的东西像一个VBScript。该脚本将您想要的结果转储到stdout,然后在java应用程序中捕获并解析结果。

+0

我从JDIC项目中找到了这个packager.jar文件。它具有WinMSIWrapper.dll的JNI包装。但是,我使用vbscript方法。 – Omar 2010-02-05 21:07:04

.MSI基本上是一个数据库。如果您可以使用Java的JdbcOdbc驱动程序读取MS Access .MDB文件,则可以使用相同的代码来打开.MSI,然后读取它的表格。

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); 
String msiFileName= "d:/java/test.msi"; 
String connectString = "jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ="; 
connectString += msiFileName.trim() + ";DriverID=22;READONLY=true}"; 
Connection con = DriverManager.getConnection(connectString ,"",""); 

至少在理论上。 :)

+0

不幸的是,它抛出一个值java.sql.SQLException: [微软] [ODBC Microsoft Access驱动程序]无法打开数据库 '(未知)'。它可能不是您的应用程序识别的数据库,或者该文件可能已损坏。 – Omar 2010-02-01 17:20:05

+0

也许尝试一个Java原生访问读者(例如,jackcess)? – jsight 2010-02-01 17:33:45

+0

理论上它应该起作用。问题可能是MSI本身。如果它不是标准的Windows安装程序MSI,则可能会失败。 – Geno 2010-02-01 18:04:15

你能否通过Java使用Windows Installer API

的API操纵MSI文件支持的唯一途径。如果您使用的是.NET或WiX,那么您将使用这些调用这些函数或函数的函数或函数。

MSI的二进制文件格式是无证和版本之间可能会发生变化,所以试图读/写的二进制格式直接只是想给你一个真实的头痛。