【问题标题】:Talend - The import org.apache cannot be resolvedTalend - 无法解析导入 org.apache
【发布时间】:2016-06-16 09:35:53
【问题描述】:

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

【问题讨论】:

  • 我想如果你不使用模块,jar 库没有链接。顺便提一句。上次导入时有两个分号。
  • 我修复了分号问题(我在 javajet 代码中留下了一个,然后 Talend 添加了另一个)。可悲的是,这不是问题所在。我编辑了我的问题,添加了我的代码。谢谢!
  • 检查 xml 文件,并添加包含 org.apache.commons 内容的 jar 文件
  • 我用我的进口信息编辑了我的问题。谢谢巴拉兹!

标签: talend


【解决方案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%>);

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

【讨论】:

  • 感谢您的回复!我删除了导入,现在我使用的是完全限定名称。现在生成了代码,但出现了与我正在使用的 commons-httpclient 类相关的其他导入错误。我已经编辑了我的帖子以显示错误。
  • 好的,我修好了。只需要在 Component Descriptor 文件中添加其他必需的导入 :) 非常感谢!
  • 我很高兴它可以工作 :) 一旦你深入兔子洞,你会发现用 java 生成 java 并不像听起来那么容易。此外,我们将代码分成 3 部分,这使得它更加复杂。
猜你喜欢
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-04
  • 2013-10-04
相关资源
最近更新 更多