Java Talend:如何在tFileOutputExcel中使用相对路径或如何获取项目目录?

Java Talend:如何在tFileOutputExcel中使用相对路径或如何获取项目目录?,java,directory,relative-path,etl,talend,Java,Directory,Relative Path,Etl,Talend,使用talend时,我希望保持项目的可移植性,因此我需要避免硬编码的绝对路径。现在我需要将一个文件导出为XLSX 假设我的项目位于Windows“D:/MyLongAndFancyPathToProjects/MyCurrentProject/talend.project”下的本地硬盘上 我从“D:/MyLongAndFancyPathToProjects/MyCurrentProject/MyOutput/test.xlsx”开始,在“文件名”处安装了tFileOutputExcel组件,它工

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

假设我的项目位于Windows
“D:/MyLongAndFancyPathToProjects/MyCurrentProject/talend.project”下的本地硬盘上

我从
“D:/MyLongAndFancyPathToProjects/MyCurrentProject/MyOutput/test.xlsx”
开始,在“文件名”处安装了tFileOutputExcel组件,它工作得很好,但正是我不想要的

然后我试着

  • “MyCurrentProject/MyOutput/test.xlsx”
  • “/MyCurrentProject/MyOutput/test.xlsx”
那些文件是在哪里创建的,但是在哪里?没能找到他们

它们未在项目目录中创建:
“D:/MyLongAndFancyPathToProjects/MyCurrentProject/”


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

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

这可以在运行时提供,也可以指定一个适用于您的默认值

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

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


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

您的文件结构将在talend安装目录中创建 对我来说,它是C:\Telend\TOS_DI-Win32-20141207_1530-V5.6.1 现在,您必须获取该路径,并使用 globalMap.put(“HOME_DIR”,System.getProperty(“user.DIR”)
现在,当你试图给出任何文件的路径时,只需在任何文件名之前添加这个globalMap i、 例如:globalMap.get(“HOME_DIR”).toString()+“/config.csv”

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


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

我发现了一个有趣的现象,它使用简单的相对目录语句“/”

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

接下来,我将这个作业(名为“myjob”)导出到我的桌面并通过批处理执行,“test”目录是在“Desktop/myjob\u 0.1/myjob/test”中创建的

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


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

我找到了一个解决方案。请注意,项目路径仅在从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;
    }
}

很遗憾,没有像currentProject.getPath()这样简单的函数-硬编码似乎很常见。感谢您的回复。由于您对Talend很在行,您也可以在Salesforce Stackexchange上回答这个问题:问题是Talend二进制文件独立于项目,因此您真正要找的是启动作业的文件夹。我同意相对文件路径可能有用,但我还不需要它,因为我一直有一组受限制的环境(本地,一组CI管道环境,然后是生产环境),我将部署Talend作业。我恐怕我从来没有太多机会与Salesforce打交道,所以这个问题有点超出我的范围。Talend的大部分静态模式将使您所要求的相对困难。这可能是可以完成的,但可能需要比正确定义模式多得多的工作。
java.nio.file.Path projectPath = Talend.projectPath(projectName);
if (projectPath != null) {
    globalMap.put("projectPath", projectPath.toString());
}