Java Talend:如何在tFileOutputExcel中使用相对路径或如何获取项目目录?
使用talend时,我希望保持项目的可移植性,因此我需要避免硬编码的绝对路径。现在我需要将一个文件导出为XLSX 假设我的项目位于WindowsJava 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组件,它工
“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());
}