运行java MainClass的工具,设计避免依赖陷阱

运行java MainClass的工具,设计避免依赖陷阱,java,testing,dependencies,runner,Java,Testing,Dependencies,Runner,我必须实现一个读取配置文件并运行配置文件中指定的应用程序/程序的工具。一种用于测试的自动运行程序。我已经实现了一个这样做的程序,但是我碰到了依赖墙。在我当前的设计工具中,它解析配置文件并检索ProgramType的映射和作业列表。根据ProgramType,选择并初始化一个Runner类,Runner类是程序src的一部分 //this is just a pseudo code pkg org.Tool class Tool { //after parsing runJobs(map

我必须实现一个读取配置文件并运行配置文件中指定的应用程序/程序的工具。一种用于测试的自动运行程序。我已经实现了一个这样做的程序,但是我碰到了依赖墙。在我当前的设计工具中,它解析配置文件并检索ProgramType的映射和作业列表。根据ProgramType,选择并初始化一个Runner类,Runner类是程序src的一部分

//this is just a pseudo code
pkg org.Tool

class Tool {
  //after parsing
  runJobs(map) {
    if(map.get() == ProgramType)
      org.Tool.JobStats = org.ProgramType.Runner.run(Job)
  }
}

pkg org.ProgramType

class Runner {
 org.Tool.JobStats run(Job) {
   if(Job = "certain job")
     return CertainJob.run(Job)
 }
}

要构建该工具,我需要编译org.ProgramType.*;要构建ProgramType,我需要org.Tool.Job和org.Tool.JobStats。我创建的“依赖地狱”显然是非常糟糕的设计。我提供了一个简单的解决方案,即调用ProgramType jar并将JobStats存储在JobStats.txt文件中,一旦jar执行完成,读取并处理该文件。此解决方案是不可接受的,因为作业可以通过多种配置等多次运行,只需处理大量的*.txt文件即可。我想我曾经看到过一个针对我的问题的编译解决方案,类似于“部分编译”工具、编译程序类型、重新编译工具。然而,我找不到它,摆脱“依赖地狱”反模式也是明智的。因此,我的问题是“我应该如何设计这个”

(我希望解释清楚,如果不只是问)

解决


正如我在评论@aviad中所写,我正在寻找一种设计模式来解决我的问题。我找到了一个叫做“依赖倒置原理”的方法。这里我链接了一个描述模式的pdf文档,值得一读(http://www.objectmentor.com/resources/articles/dip.pdf)(另一个很好的解释)。谢谢大家的帮助(我真的很喜欢你推荐的框架)。

如果你能使用框架,我认为你仍然可以使用大部分代码

使用springbatch的优点是,它是一个已经完成所有硬工作(配置、多线程、持久性等)的框架

基本上,您需要运行的java程序可以通过运行批处理文件\shell脚本来执行,该脚本启动:

java -cp %JOB_CLASSPATH% %JOB_MAIN_CLASS_FULLY_QUALIFIED_CLASS_NAME%
因此,我将使用以下设计:

整个解决方案是基于Spring的应用程序。 控制器类(您的主类),用于读取配置并运行显示。控制器类用作业及其配置填充作业队列。然后从队列中检索每个作业,并以编程方式实例化和运行Spring批处理作业

您还可以使用从java执行批处理文件\shell脚本

稍后,您可以移动到在web容器中运行(以便启用配置更改和通过http触发的作业)-检查

如果您使用


祝你好运

如果可以使用框架,我认为您仍然可以使用大部分代码

使用springbatch的优点是,它是一个已经完成所有硬工作(配置、多线程、持久性等)的框架

基本上,您需要运行的java程序可以通过运行批处理文件\shell脚本来执行,该脚本启动:

java -cp %JOB_CLASSPATH% %JOB_MAIN_CLASS_FULLY_QUALIFIED_CLASS_NAME%
因此,我将使用以下设计:

整个解决方案是基于Spring的应用程序。 控制器类(您的主类),用于读取配置并运行显示。控制器类用作业及其配置填充作业队列。然后从队列中检索每个作业,并以编程方式实例化和运行Spring批处理作业

您还可以使用从java执行批处理文件\shell脚本

稍后,您可以移动到在web容器中运行(以便启用配置更改和通过http触发的作业)-检查

如果您使用


祝你好运

你是说依赖注入吗?如果是这样的话,看看Guice这里我应该如何设计这个?简单回答:像maven;更简短的是:reflectionCatalin Thx作为提示,我将研究它@guido不是很容易发生反射错误并且很难维护吗?你是说依赖注入吗?如果是这样的话,看看Guice这里我应该如何设计这个?简单回答:像maven;更简短的是:reflectionCatalin Thx作为提示,我将研究它@guido不容易发生反射错误并且很难维护吗?Thx对于框架建议,我也将研究它们。虽然框架可以解决我的问题,但我更想知道(只是为了了解情况)在不使用外部jar的情况下,如何在J2SE中实现这一点。这类应用程序的某种“设计模式”。Thx对于框架建议,我也将研究它们。虽然框架可以解决我的问题,但我更想知道(只是为了了解情况)在不使用外部jar的情况下,如何在J2SE中实现这一点。这类应用程序的某种“设计模式”。