【问题标题】:Talend: How to use relative path in tFileOutputExcel or how to get the project dir?Talend:如何在 tFileOutputExcel 中使用相对路径或如何获取项目目录?
【发布时间】:2015-04-30 08:22:11
【问题描述】:

使用 talend,我想保持项目的可移植性,因此我需要避免硬编码的绝对路径。现在我需要将文件导出为 XLSX。

假设我的项目驻留在 Windows 下的本地硬盘上 "D:/MyLongAndFancyPathToProjects/MyCurrentProject/talend.project"

“文件名”中的 tFileOutputExcel 组件我从 "D:/MyLongAndFancyPathToProjects/MyCurrentProject/MyOutput/test.xlsx" 开始,效果很好 - 但正是我不想要的。

然后我尝试了

  • "MyCurrentProject/MyOutput/test.xlsx"
  • "/MyCurrentProject/MyOutput/test.xlsx"

那些文件在哪里创建,但在哪里?找不到他们...

他们没有在项目目录中创建:"D:/MyLongAndFancyPathToProjects/MyCurrentProject/"

如何在 Talend 中获取当前项目?如果可能,我想避免配置设置。这应该以某种方式动态地工作。

【问题讨论】:

    标签: java directory relative-path etl talend


    【解决方案1】:

    我知道您希望它动态工作,但您的第一步应该是创建一个上下文变量,其中包含您的 Excel 文件所在文件夹的路径。

    这可以在运行时提供或给定一个适合您的默认值。

    一旦你完成了这项工作,下一个技巧就是尝试获取执行作业的路径,如果上下文变量没有明确提供路径,则使用该路径。

    我现在无法访问 Studio 客户端来测试它,但应该可以使用 tSystem 组件来获取当前工作目录。因此,在基于 Linux 的操作系统中,您可以从 tSystem 组件运行 pwd 以获取文件夹路径。

    如果提供的变量为空或空白,则应将其设置为文件夹路径上下文变量。

    【讨论】:

    • 很遗憾,没有像 currentProject.getPath() 这样的简单函数 - 硬编码似乎很常见。感谢您的回复。
    • 既然您在 Talend 方面表现出色,您或许也可以在 Salesforce-Stackexchange 上回答这个问题:salesforce.stackexchange.com/questions/67777/…
    • 问题在于 Talend 二进制文件独立于项目,因此您真正需要的是启动作业的文件夹。我同意相对文件路径可能有用,但我还没有需要它,因为我一直有一组受限的环境(本地、一组 CI 管道环境,然后是生产环境),我会将 Talend 作业部署到这些环境。跨度>
    • 恐怕我从来没有太多机会使用 Salesforce,所以这个问题有点超出我的理解。不过,Talend 的大部分静态模式将使您的要求相对困难。它可能可以完成,但可能需要比仅仅正确定义架构更多的工作。
    【解决方案2】:

    您的文件结构将在您的 talend 安装目录中创建 对我来说是 C:\Telend\TOS_DI-Win32-20141207_1530-V5.6.1 现在您必须获取此路径并将其存储在变量中 globalMap.put("HOME_DIR", System.getProperty("user.dir"));
    现在,当尝试提供任何文件的路径时,只需在任何文件名之前添加这个 globalMap 即:globalMap.get("HOME_DIR").toString()+"/config.csv"

    最后,当您导出作业时,您必须放置相同的文件 靠近你exiquable bat文件,这样可以解决你的问题:)

    通过这样做,您可以为文件提供动态路径

    【讨论】:

      【解决方案3】:

      我发现感兴趣的现象是使用简单的相对目录语句“./”。

      首先,我使用“tCreateTemporaryFile”设置目录“./test”。当我在 TOS 中执行时,在“C:/TOS_DI-Win32-r****-V5.3.1/test”中创建了“test”目录。

      接下来,我将此作业(名称“myjob”)导出到我的桌面并通过批处理执行,在“Desktop/myjob_0.1/myjob/test”中创建了“test”目录。

      第三,我重置目录“../test”并在桌面上导出和执行。 “test”目录是在“Desktop/myjob_0.1/test”中创建的。

      我们可以使用简单的相对目录“./”作为当前目录,“../”作为父目录。

      【讨论】:

        【解决方案4】:

        这是我找到的解决方案。请注意,项目路径仅在从 Talend Open Studio 运行时可用,在作为独立应用程序运行时不可用。

        在您的例程中添加这个 Talend 助手类:

        package routines;
        
        import java.nio.file.Files;
        import java.nio.file.Path;
        import java.nio.file.Paths;
        import java.util.Arrays;
        import java.util.Optional;
        import java.util.stream.Stream;
        
        public class Talend {
            /**
             * @param projectName The project name, available as `projectName` in Talend components
             * @return the project path when run from Talend Open Studio or null when run as a standalone executable
             */
            public static Path projectPath(String projectName) {
                String[] classPathElements = System.getProperty("java.class.path", "").split(";");
                Stream<Path> classPaths = Arrays.stream(classPathElements).map(path -> Paths.get(path));
                Optional<Path> classesPath = classPaths.filter(path -> path.endsWith(Paths.get(".Java", "target", "classes"))).findAny();
                if (classesPath.isPresent()) {
                    Path workspacePath = classesPath.get().getParent().getParent().getParent();
                    Path projectPath = workspacePath.resolve(projectName);
                    if (Files.isDirectory(projectPath)) {
                        return projectPath;
                    }
                }
                return null;
            }
        }
        

        然后在工作开始的tJava 组件中,您可以将项目路径保存在全局地图中,例如:

        java.nio.file.Path projectPath = Talend.projectPath(projectName);
        if (projectPath != null) {
            globalMap.put("projectPath", projectPath.toString());
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-24
          相关资源
          最近更新 更多