kettle 3.2的webstart

在尝试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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值