Java 如何从Maven项目在JBoss上运行Talend作业?

Java 如何从Maven项目在JBoss上运行Talend作业?,java,eclipse,maven,jboss5.x,talend,Java,Eclipse,Maven,Jboss5.x,Talend,从Talend Open Studio for Data Integration 5.3.1(在Windows 7上)导出作业后,如何从我的Eclipse Maven项目运行Talend作业? 哪些依赖项是特定于作业的,哪些依赖项是全局的 我的Eclipse项目正在JBoss 5.1.0.GA上运行。它为接收到的每种文件运行Talend作业,并对每种文件执行ETL过程。 我通过执行“导出作业-自治作业”从Talend导出每个作业,并将JAR文件添加为Maven项目的依赖项。但是我不认为我可以在服

Talend Open Studio for Data Integration 5.3.1(在Windows 7上)导出作业后,如何从我的Eclipse Maven项目运行Talend作业? 哪些依赖项是特定于作业的,哪些依赖项是全局的


我的Eclipse项目正在JBoss 5.1.0.GA上运行。它为接收到的每种文件运行Talend作业,并对每种文件执行ETL过程。
我通过执行“导出作业-自治作业”从Talend导出每个作业,并将JAR文件添加为Maven项目的依赖项。但是我不认为我可以在服务器上运行作业来完成这项工作。

看起来你做的一切都很好,你所需要的只是创建正确的pom.xml,它将包括jar和context.properties到你的项目中。我正在创建一个包含必要文件的工件。下面是我的pom示例:

    <copy todir="${project.build.outputDirectory}">
       <fileset dir="${basedir}/My_Job_Main/" includes="*.jar"/>
    </copy>
    <jar destfile="${project.build.outputDirectory}/myJar.jar">
      <zipfileset dir="${basedir}/My_Job_Main/" 
         includes="**/my_job_main/**"
         excludes="**/src/**,**/items/**"/>
    </jar>
    <zip destfile="${basedir}/target/my.artifact.id-1.0-SNAPSHOT.jar">
       <zipgroupfileset dir="${project.build.outputDirectory}" includes="*.jar"/>
    </zip>
解决方案2:

但这个解决方案是我不喜欢的。因此,我建议在导出作业时导出作业,并动态加载它们,而无需使用Maven进行部署。它将为您提供在不重新启动服务器的情况下更改作业的灵活性

下面是动态加载作业jar文件并执行它们的代码示例:

URL [] urls = new URL[length];

File jar = new File("path_to_jo_jar_file");
urls[0] = jar.toURI().toURL();

String params[] = new String[length];
params[0] = "--context=Default";
params[1] = "--context_param";
params[2] = "paramName=paramValue";

Class<?>[] params_type = new Class[]{String[].class};
URLClassLoader child = new URLClassLoader(urls , this.getClass().getClassLoader()); 
Class classToLoad = Class.forName( "my_job_main.My_Job_Main", true, child);
Method method = classToLoad.getDeclaredMethod ("runJobInTOS", params_type);
method.setAccessible(true);
Object instance = classToLoad.newInstance();
method.invoke(instance, new Object[]{ args } );
URL[]URL=newurl[length];
File jar=新文件(“路径_到_jo_jar_文件”);
URL[0]=jar.toURI().tour();
字符串参数[]=新字符串[长度];
参数[0]=“--context=Default”;
参数[1]=“--context_param”;
params[2]=“paramName=paramValue”;
类[]参数类型=新类[]{String[].Class};
URLClassLoader child=新的URLClassLoader(URL,this.getClass().getClassLoader());
Class classToLoad=Class.forName(“my_job_main.my_job_main”,true,child);
方法Method=classToLoad.getDeclaredMethod(“runJobInTOS”,参数类型);
方法setAccessible(true);
对象实例=classToLoad.newInstance();
调用(实例,新对象[]{args});

希望这有帮助。如果您还有更多问题,请发表评论。

看起来您做得很好,您所需要的只是创建正确的pom.xml,其中将包括jar和context.properties到您的项目中。我正在创建一个包含必要文件的工件。下面是我的pom示例:

    <copy todir="${project.build.outputDirectory}">
       <fileset dir="${basedir}/My_Job_Main/" includes="*.jar"/>
    </copy>
    <jar destfile="${project.build.outputDirectory}/myJar.jar">
      <zipfileset dir="${basedir}/My_Job_Main/" 
         includes="**/my_job_main/**"
         excludes="**/src/**,**/items/**"/>
    </jar>
    <zip destfile="${basedir}/target/my.artifact.id-1.0-SNAPSHOT.jar">
       <zipgroupfileset dir="${project.build.outputDirectory}" includes="*.jar"/>
    </zip>
解决方案2:

但这个解决方案是我不喜欢的。因此,我建议在导出作业时导出作业,并动态加载它们,而无需使用Maven进行部署。它将为您提供在不重新启动服务器的情况下更改作业的灵活性

下面是动态加载作业jar文件并执行它们的代码示例:

URL [] urls = new URL[length];

File jar = new File("path_to_jo_jar_file");
urls[0] = jar.toURI().toURL();

String params[] = new String[length];
params[0] = "--context=Default";
params[1] = "--context_param";
params[2] = "paramName=paramValue";

Class<?>[] params_type = new Class[]{String[].class};
URLClassLoader child = new URLClassLoader(urls , this.getClass().getClassLoader()); 
Class classToLoad = Class.forName( "my_job_main.My_Job_Main", true, child);
Method method = classToLoad.getDeclaredMethod ("runJobInTOS", params_type);
method.setAccessible(true);
Object instance = classToLoad.newInstance();
method.invoke(instance, new Object[]{ args } );
URL[]URL=newurl[length];
File jar=新文件(“路径_到_jo_jar_文件”);
URL[0]=jar.toURI().tour();
字符串参数[]=新字符串[长度];
参数[0]=“--context=Default”;
参数[1]=“--context_param”;
params[2]=“paramName=paramValue”;
类[]参数类型=新类[]{String[].Class};
URLClassLoader child=新的URLClassLoader(URL,this.getClass().getClassLoader());
Class classToLoad=Class.forName(“my_job_main.my_job_main”,true,child);
方法Method=classToLoad.getDeclaredMethod(“runJobInTOS”,参数类型);
方法setAccessible(true);
对象实例=classToLoad.newInstance();
调用(实例,新对象[]{args});

希望这有帮助。如果您还有更多问题,请发表评论。

请详细说明您的问题。你的环境是什么?如何导出Talend项目?我的Eclipse项目正在JBoss上运行。它为接收到的每种文件运行Talend作业,并对每种文件执行ETL过程。我正在通过执行“导出作业”从Talend Open Studio中导出每个作业以进行数据集成,并将JAR文件添加为Maven项目的依赖项。您是否将Talend作业导出为独立作业?或者它们部署在应用程序容器中?您使用的是哪种环境?窗户?Unix。请更新您的原始问题以包括这些。请详细说明您的问题。你的环境是什么?如何导出Talend项目?我的Eclipse项目正在JBoss上运行。它为接收到的每种文件运行Talend作业,并对每种文件执行ETL过程。我正在通过执行“导出作业”从Talend Open Studio中导出每个作业以进行数据集成,并将JAR文件添加为Maven项目的依赖项。您是否将Talend作业导出为独立作业?或者它们部署在应用程序容器中?您使用的是哪种环境?窗户?Unix。请更新您的原始问题以包括这些问题。