Talend - 无法解析导入 org.apache

Talend - The import org.apache cannot be resolved

我创建了一个自定义 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>

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

遗憾的是,该组件输出相同的错误。

编辑 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.run(URLClassLoader.java:372)
    at java.net.URLClassLoader.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]

因此在您的 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%>);

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