Talend - 无法解析导入org.apache

时间:2016-06-16 09:35:53

标签: talend

我创建了一个自定义Talend组件,该组件在某个步骤连接到外部Http服务。为此,我通过javajet导入使用org.apache.commons.httpclient。我已经看到模块视图中已存在模块。然而,当运行作业时,控制台输出:

Execution failed : Failed to generate code.
[----------
1. ERROR in /Users/frb/Downloads/TOS_DI-20160510_1709-V6.2.0/workspace/.JETEmitters/src/org/talend/designer/codegen/translators/ngsi/orion/TOrionAppendBeginJava.java (at line 14)
    import org.apache.commons.httpclient.*;
           ^^^^^^^^^^
The import org.apache cannot be resolved
----------
2. ERROR in /Users/frb/Downloads/TOS_DI-20160510_1709-V6.2.0/workspace/.JETEmitters/src/org/talend/designer/codegen/translators/ngsi/orion/TOrionAppendBeginJava.java (at line 15)
    import org.apache.commons.httpclient.methods.*;
           ^^^^^^^^^^
The import org.apache cannot be resolved
----------
3. ERROR in /Users/frb/Downloads/TOS_DI-20160510_1709-V6.2.0/workspace/.JETEmitters/src/org/talend/designer/codegen/translators/ngsi/orion/TOrionAppendBeginJava.java (at line 16)
    import org.apache.commons.httpclient.params.HttpMethodParams;;
           ^^^^^^^^^^
The import org.apache cannot be resolved
----------
3 problems (3 errors)
]

有关如何解决此问题的任何提示?我的Talend版本是6.2.0。

编辑1

这是我的开始代码:

<%@ jet 
    imports="
        org.talend.core.model.process.INode 
        org.talend.core.model.process.ElementParameterParser 
        org.talend.core.model.metadata.IMetadataTable 
        org.talend.core.model.metadata.IMetadataColumn 
        org.talend.core.model.process.IConnection
        org.talend.core.model.process.IConnectionCategory
        org.talend.designer.codegen.config.CodeGeneratorArgument
        org.talend.core.model.metadata.types.JavaTypesManager
        org.talend.core.model.metadata.types.JavaType
        java.util.List
        java.util.Map
        org.apache.commons.httpclient.*
        org.apache.commons.httpclient.methods.*
        org.apache.commons.httpclient.params.HttpMethodParams
    " 
%>
<% 
    // Get the CID
    CodeGeneratorArgument codeGenArgument = (CodeGeneratorArgument) argument;
    INode node = (INode)codeGenArgument.getArgument();
    String cid = node.getUniqueName();

    // Get the component parameters
    String orionEndpoint = ElementParameterParser.getValue(node, "__ORION_ENDPOINT__");
    String authEndpoint = ElementParameterParser.getValue(node, "__AUTH_ENDPOINT__");
    String authUsername = ElementParameterParser.getValue(node, "__AUTH_USERNAME__");
    String authPassword = ElementParameterParser.getValue(node, "__AUTH_PASSWORD__");
    String entityIdField = ElementParameterParser.getValue(node, "__ENTITY_ID_FIELD__");
    String entityTypeField = ElementParameterParser.getValue(node, "__ENTITY_TYPE_FIELD__");
    String defaultEntityType = ElementParameterParser.getValue(node, "__DEFAULT_ENTITY_TYPE__");
    String ignoredFilds = ElementParameterParser.getValue(node, "__IGNORED_FIELDS__");
%>
    System.out.println("I am the begin section");
    HttpClient client = new HttpClient();
    PostMethod method = new PostMethod(<%=authEndpoint%>);
    method.setRequestHeader(new Header("Content-Type", "application/json"));
    method.setRequestBody("{\"username\":\"" + <%=authUsername%> + "\",\"password\":\"" + <%=authPassword%> + "\"}");

    try {
        int statusCode = client.executeMethod(method);

        if (statusCode != HttpStatus.SC_OK) {
            System.err.println("Method failed: " + method.getStatusLine());
        } // if

        byte[] responseBody = method.getResponseBody();
        System.out.println(new String(responseBody));
    } catch (HttpException e) {
      System.err.println("Fatal protocol violation: " + e.getMessage());
      e.printStackTrace();
    } catch (IOException e) {
      System.err.println("Fatal transport error: " + e.getMessage());
      e.printStackTrace();
    } finally {
      method.releaseConnection();
    } // try

编辑2
我已将以下内容添加到我的组件描述符文件中:

<IMPORTS>
  <IMPORT
    NAME="commons-httpclient"
    MODULE="commons-httpclient-3.1.jar"
    REQUIRED="true"
  />
</IMPORTS>

现在,在模块视图中,我能够看到以下内容:

enter image description here

可悲的是,组件输出相同的错误。

编辑3
删除导入并使用完全限定名称后,如@Balazs Gunics所建议的那样,代码似乎已生成。然而,与commons-httpclient相关的一些其他错误在运行时出现:

Starting job job_tOrionAppend at 08:20 21/06/2016.
[statistics] connecting to socket on port 3916
[statistics] connected
I am the begin section
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory
    at org.apache.commons.httpclient.HttpClient.<clinit>(HttpClient.java:66)
    at iotp_talend_connectors.job_torionappend_0_1.job_tOrionAppend.tMysqlInput_1Process(job_tOrionAppend.java:854)
    at iotp_talend_connectors.job_torionappend_0_1.job_tOrionAppend.tMysqlConnection_1Process(job_tOrionAppend.java:422)
    at iotp_talend_connectors.job_torionappend_0_1.job_tOrionAppend.runJobInTOS(job_tOrionAppend.java:1355)
    at iotp_talend_connectors.job_torionappend_0_1.job_tOrionAppend.main(job_tOrionAppend.java:1212)
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
    at java.net.URLClassLoader$1.run(URLClassLoader.java:372)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:361)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:360)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
[statistics] disconnected
[statistics] disconnected
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
    ... 5 more
Job job_tOrionAppend ended at 08:20 21/06/2016. [exit code=1]

1 个答案:

答案 0 :(得分:2)

因此,在您的begin.javajet代码中,以下代码将仅为代码生成本身导入这些库。但是你需要它们来生成代码。 使用java生成java使得很难监督它。

<%@ jet 
    imports="
    org.apache.commons.httpclient.*
    org.apache.commons.httpclient.methods.*
    org.apache.commons.httpclient.params.HttpMethodParams

所以你需要的是将这些导入添加到生成的代码中。那是不可能的:( https://www.talendforge.org/forum/viewtopic.php?id=3670要做到这一点,你需要修改组件的xml描述符。 所以你的进口是正确的。您所要做的就是确保使用完全限定名称。即:这段代码:

System.out.println("I am the begin section");
HttpClient client = new HttpClient();
PostMethod method = new PostMethod(<%=authEndpoint%>);

必须重写为:

System.out.println("I am the begin section");
org.apache.commons.httpclient.HttpClient client =
   new org.apache.commons.httpclient.HttpClient();
org.apache.commons.httpclient.methods.PostMethod method = 
   new org.apache.commons.httpclient.methods.PostMethod(<%=authEndpoint%>);

是的,如果我们可以导入类并使用它们会更优雅。