在尝试Kettle的webstart方式运行时,遇到了一点问题,最终解决。
一、下载kettle
从http://sourceforge.net/projects/pentaho/files/下载pdi3.2(也就是kettle)。
二、ant webstart
解压后等到kettle trunk目录,在cmd下,直接ant webstart
如果出现编译错误,是因为没有把当前路径加到classpath。
再尝试,会出现以下错误:
signjar] Signing JAR: G:/Work/Kettle/webstart/libext/salesforce/saaj.jar
[signjar] 警告: 签名者证书将在六个月内过期。
[signjar] Signing JAR: G:/Work/Kettle/webstart/libext/salesforce/salesforce-1.0.jar
[signjar] jarsigner: 无法对 jar 进行签名 : java.util.zip.ZipException: duplicate entry: com/sforce/soap/partner/AssignmentRuleHeader.class BUILD FAILED
产生的原因为libext/salesforce/salesforce-1.0.jar 里面有重复的文件,不知道为什么会这样,删除重复的文件后(可先用WinRAR解缩,再用压缩),就正常了。
三、部署
将生成的war包,改名为了kettle.war,放到Tomcat的webapps下。
访问http://localhost:8080/kettle,就可以页面上看到一个链接,点击链接将开始下载jnlp依赖的jar文件。
如果你使用的Tomcat是6.0之前的,请在%tomcat_home%/conf/web.xml文件中,添加
<mime-mapping> <extension>jnlp</extension> <mime-type>application/x-java-jnlp-file</mime-type> </mime-mapping>
下载过程中,会出现一个“jar签名不一致 ”的错误,产生的原因是spoon.jnlp依赖到的部分jar,已经有其他厂商签名过了。
请删除spoon.jnlp中这段代码:
<jar href="libswt/common.jar"/> <jar href="libswt/commands.jar"/> <jar href="libswt/jface.jar"/> <jar href="libswt/runtime.jar"/>
继续尝试,还会提示找不到Spoon类 ,需要修改spoon.jnlp,指定Main文件所在的jar
<jar href="lib/kettle-ui-swt.jar" main="true"/>
继续尝试,已经可以完全下载,出现安全提示,点击“运行”之后,屏幕闪了一下,就没有任何显示了。
启用Java 控制台,发现错误如下:
Exception in thread "javawsApplicationMain" java.lang.NoClassDefFoundError: org/pentaho/di/core/database/DatabaseMeta
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Unknown Source)
at java.lang.Class.getMethod0(Unknown Source)
因为没有导入kettle-db.jar,修改spoon.jnpl
<jar href="lib/kettle-core.jar"/> <jar href="lib/kettle-ui-swt.jar" main="true"/> <jar href="lib/kettle-engine.jar"/> <jar href="lib/kettle-db.jar"/>
还是会有异常出现说找不到图片文件。
NFO 27-08 15:15:50,734 - Using "C:/DOCUME~1/administator/LOCALS~1/Temp/vfs_cache" as temporary files store.
ERROR 27-08 15:15:51,234 - Spoon - Fatal error : java.lang.RuntimeException: Unable to load image with name [ui/images/spoon.ico]
ERROR 27-08 15:15:51,234 - Spoon - java.lang.RuntimeException: Unable to load image with name [ui/images/spoon.ico]
at org.pentaho.di.ui.util.ImageUtil.getImageAsResource(ImageUtil.java:77)
at org.pentaho.di.ui.core.dialog.Splash.<init>(Splash.java:48)
at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:380)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.continueLaunch(Unknown Source)
at com.sun.javaws.Launcher.handleApplicationDesc(Unknown Source)
at com.sun.javaws.Launcher.handleLaunchFile(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
将源文件的ui目录复制到桌面,再运行,窗口已经可以显示,但还是有错误信息:
ERROR 27-08 15:21:05,062 - Kettle - Unable to create job entry from plugin [org.pentaho.di.job.JobPlugin: SSH2_GET(NATIVE)]
ERROR 27-08 15:21:05,062 - Kettle - org.pentaho.di.core.exception.KettleStepLoaderException:
Unexpected error loading class
com/trilead/ssh2/ServerHostKeyVerifier
at org.pentaho.di.job.JobEntryLoader.getJobEntryClass(JobEntryLoader.java:258)
at org.pentaho.di.ui.core.gui.GUIResource.loadJobEntryImages(GUIResource.java:678)
at org.pentaho.di.ui.core.gui.GUIResource.getResources(GUIResource.java:322)
at org.pentaho.di.ui.core.gui.GUIResource.<init>(GUIResource.java:256)
at org.pentaho.di.ui.core.gui.GUIResource.getInstance(GUIResource.java:273)
at org.pentaho.di.ui.core.PropsUI.init(PropsUI.java:100)
at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:387)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.continueLaunch(Unknown Source)
at com.sun.javaws.Launcher.handleApplicationDesc(Unknown Source)
at com.sun.javaws.Launcher.handleLaunchFile(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: com/trilead/ssh2/ServerHostKeyVerifier
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.pentaho.di.job.JobEntryLoader.getJobEntryClass(JobEntryLoader.java:211)
... 17 more
ERROR 27-08 15:21:05,062 - Kettle - Unable to create job entry from plugin [org.pentaho.di.job.JobPlugin: SSH2_PUT(NATIVE)]
ERROR 27-08 15:21:05,078 - Kettle - org.pentaho.di.core.exception.KettleStepLoaderException:
Unexpected error loading class
com/trilead/ssh2/ServerHostKeyVerifier
at org.pentaho.di.job.JobEntryLoader.getJobEntryClass(JobEntryLoader.java:258)
at org.pentaho.di.ui.core.gui.GUIResource.loadJobEntryImages(GUIResource.java:678)
at org.pentaho.di.ui.core.gui.GUIResource.getResources(GUIResource.java:322)
at org.pentaho.di.ui.core.gui.GUIResource.<init>(GUIResource.java:256)
at org.pentaho.di.ui.core.gui.GUIResource.getInstance(GUIResource.java:273)
at org.pentaho.di.ui.core.PropsUI.init(PropsUI.java:100)
at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:387)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.continueLaunch(Unknown Source)
at com.sun.javaws.Launcher.handleApplicationDesc(Unknown Source)
at com.sun.javaws.Launcher.handleLaunchFile(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: com/trilead/ssh2/ServerHostKeyVerifier
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.pentaho.di.job.JobEntryLoader.getJobEntryClass(JobEntryLoader.java:211)
... 17 more
ERROR 27-08 15:21:05,078 - Kettle - Unable to create job entry from plugin [org.pentaho.di.job.JobPlugin: FTP_DELETE(NATIVE)]
ERROR 27-08 15:21:05,078 - Kettle - org.pentaho.di.core.exception.KettleStepLoaderException:
Unexpected error loading class
com/trilead/ssh2/ProxyData
at org.pentaho.di.job.JobEntryLoader.getJobEntryClass(JobEntryLoader.java:258)
at org.pentaho.di.ui.core.gui.GUIResource.loadJobEntryImages(GUIResource.java:678)
at org.pentaho.di.ui.core.gui.GUIResource.getResources(GUIResource.java:322)
at org.pentaho.di.ui.core.gui.GUIResource.<init>(GUIResource.java:256)
at org.pentaho.di.ui.core.gui.GUIResource.getInstance(GUIResource.java:273)
at org.pentaho.di.ui.core.PropsUI.init(PropsUI.java:100)
at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:387)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.continueLaunch(Unknown Source)
at com.sun.javaws.Launcher.handleApplicationDesc(Unknown Source)
at com.sun.javaws.Launcher.handleLaunchFile(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: com/trilead/ssh2/ProxyData
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.pentaho.di.job.JobEntryLoader.getJobEntryClass(JobEntryLoader.java:211)
... 17 more
ERROR 27-08 15:21:05,218 - Kettle - Unable to create job entry from plugin [org.pentaho.di.job.JobPlugin: SNMP_TRAP(NATIVE)]
ERROR 27-08 15:21:05,218 - Kettle - org.pentaho.di.core.exception.KettleStepLoaderException:
Unexpected error loading class
org/snmp4j/TransportMapping
at org.pentaho.di.job.JobEntryLoader.getJobEntryClass(JobEntryLoader.java:258)
at org.pentaho.di.ui.core.gui.GUIResource.loadJobEntryImages(GUIResource.java:678)
at org.pentaho.di.ui.core.gui.GUIResource.getResources(GUIResource.java:322)
at org.pentaho.di.ui.core.gui.GUIResource.<init>(GUIResource.java:256)
at org.pentaho.di.ui.core.gui.GUIResource.getInstance(GUIResource.java:273)
at org.pentaho.di.ui.core.PropsUI.init(PropsUI.java:100)
at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:387)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.continueLaunch(Unknown Source)
at com.sun.javaws.Launcher.handleApplicationDesc(Unknown Source)
at com.sun.javaws.Launcher.handleLaunchFile(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NoClassDefFoundError: org/snmp4j/TransportMapping
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at org.pentaho.di.job.JobEntryLoader.getJobEntryClass(JobEntryLoader.java:211)
... 17 more
INFO 27-08 15:21:05,640 - Spoon - 主窗口被创建
INFO 27-08 15:21:05,656 - Spoon - 要求资源库
INFO 27-08 15:21:05,718 - RepositoriesMeta - Reading repositories XML file: C:/Documents and Settings/administrator/.kettle/repositories.xml
[Fatal Error] repositories.xml:6:69: Invalid byte 2 of 2-byte UTF-8 sequence.
ERROR 27-08 15:21:05,765 - RepositoriesMeta - Error reading information from file : org.xml.sax.SAXParseException: Invalid byte 2 of 2-byte UTF-8 sequence.
ERROR 27-08 15:21:05,765 - RepositoriesMeta - org.xml.sax.SAXParseException: Invalid byte 2 of 2-byte UTF-8 sequence.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
at org.pentaho.di.repository.RepositoriesMeta.readData(RepositoriesMeta.java:167)
at org.pentaho.di.ui.repository.dialog.RepositoriesDialog.<init>(RepositoriesDialog.java:132)
at org.pentaho.di.ui.spoon.Spoon.selectRep(Spoon.java:5416)
at org.pentaho.di.ui.spoon.Spoon.start(Spoon.java:5548)
at org.pentaho.di.ui.spoon.Spoon.main(Spoon.java:412)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.continueLaunch(Unknown Source)
at com.sun.javaws.Launcher.handleApplicationDesc(Unknown Source)
at com.sun.javaws.Launcher.handleLaunchFile(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
hi,
发现没有记录Job的id到,Trans的日志表中。
Job在运行时,会将Job运行时的Id,传递给Trans,见代码
public Result execute(Result result, int nr, Repository rep, Job parentJob) throws KettleException{
....
// Create the transformation from meta-data
//
Trans trans = new Trans(transMeta);
// Pass the socket repository as early as possible...
//
trans.setSocketRepository(parentJob.getSocketRepository());
if (parentJob.getJobMeta().isBatchIdPassed())
{
trans.setPassedBatchId(parentJob.getPassedBatchId());
}
但写日志表根据没有这个栏位。
在执行Trans类的 public boolean endProcessing(String status) 方法时,写日志表。中间部分代码
if (!Const.isEmpty(transMeta.getLogTable())) {
ldb.writeLogRecord(transMeta.getLogTable(), transMeta.isBatchIdUsed(), getBatchId(),
false, transMeta.getName(), status, result.getNrLinesRead(), result
.getNrLinesWritten(), result.getNrLinesUpdated(),
result.getNrLinesInput() + result.getNrFilesRetrieved(), result
.getNrLinesOutput(), result.getNrErrors(), startDate, endDate,
logDate, depDate, currentDate, log_string);
}
org.pentaho.di.core.database.Database类的
public void writeLogRecord(String logtable, boolean use_id, long id,
boolean job, String name, String status, long read, long written,
long updated, long input, long output, long errors,
java.util.Date startdate, java.util.Date enddate,
java.util.Date logdate, java.util.Date depdate,
java.util.Date replayDate, String log_string)
throws KettleDatabaseException {
checkConnection();
boolean update = use_id && log_string != null
&& !status.equalsIgnoreCase(LOG_STATUS_START);
RowMetaInterface rowMeta;
if (job) {
rowMeta = getJobLogrecordFields(update, use_id, !Const
.isEmpty(log_string));
} else {
rowMeta = getTransLogrecordFields(update, use_id, !Const
.isEmpty(log_string));
}
if (update) {
String sql = "UPDATE " + logtable + " SET ";
for (int i = 0; i < rowMeta.size() - 1; i++) // Without ID_JOB or
// ID_BATCH
{
ValueMetaInterface valueMeta = rowMeta.getValueMeta(i);
if (i > 0) {
sql += ", ";
}
sql += databaseMeta.quoteField(valueMeta.getName()) + "=? ";
}
sql += "WHERE ";
if (job) {
sql += databaseMeta.quoteField("ID_JOB") + "=? ";
} else {
sql += databaseMeta.quoteField("ID_BATCH") + "=? ";
}
Object[] data = new Object[] { status, Long.valueOf(read),
Long.valueOf(written), Long.valueOf(updated),
Long.valueOf(input), Long.valueOf(output),
Long.valueOf(errors), startdate, enddate, logdate, depdate,
replayDate, log_string, Long.valueOf(id), };
execStatement(sql, rowMeta, data);
} else {
String sql = "INSERT INTO " + logtable + " ( ";
for (int i = 0; i < rowMeta.size(); i++) {
ValueMetaInterface valueMeta = rowMeta.getValueMeta(i);
if (i > 0)
sql += ", ";
sql += databaseMeta.quoteField(valueMeta.getName());
}
sql += ") VALUES(";
for (int i = 0; i < rowMeta.size(); i++) {
if (i > 0)
sql += ", ";
sql += "?";
}
sql += ")";
try {
pstmt = connection.prepareStatement(databaseMeta.stripCR(sql));
List<Object> data = new ArrayList<Object>();
if (job) {
if (use_id) {
data.add(Long.valueOf(id));
}
data.add(name);
} else {
if (use_id) {
data.add(Long.valueOf(id));
}
data.add(name);
}
data.add(status);
data.add(Long.valueOf(read));
data.add(Long.valueOf(written));
data.add(Long.valueOf(updated));
data.add(Long.valueOf(input));
data.add(Long.valueOf(output));
data.add(Long.valueOf(errors));
data.add(startdate);
data.add(enddate);
data.add(logdate);
data.add(depdate);
data.add(replayDate);
if (!Const.isEmpty(log_string)) {
data.add(log_string);
}
setValues(rowMeta, data.toArray(new Object[data.size()]));
pstmt.executeUpdate();
pstmt.close();
pstmt = null;
} catch (SQLException ex) {
throw new KettleDatabaseException(
"Unable to write log record to log table " + logtable,
ex);
}
}
}
转载:http://cleaneyes.javaeye.com/category/117059?show_full=true