【问题标题】:How should I invoke a packaged spring project from another spring project?我应该如何从另一个 spring 项目中调用一个打包的 spring 项目?
【发布时间】:2013-10-11 08:58:48
【问题描述】:

我有两个使用 maven 的 spring 项目。第一个是一些 api 的客户端,第二个是控制台程序,它在一定程度上利用了该客户端。

我已经将客户端打包成一个jar,并在控制台程序的pom中引用它。

我已经设法让这个工作,但我对解决方案不是很满意:

1) 我遇到的第一个问题是每个上下文 xml 文件都被命名为“applicationContext.xml”。因此,我无法找到任何方法来引用客户端中的上下文文件,而无需将其重命名为其他名称,例如客户端上下文.xml。这可行,但还有其他方法可以明确引用它吗?

2) 下一个问题是如何从控制台程序中调用 clientContext.xml。为此,我在控制台程序的 applicationContext.xml 中添加了<import resource="osrdClientContext.xml"/>,这似乎允许它正确找到所有定义的 bean。我不确定这是否是最佳做法?

3) 在clientContext.xml 中,我需要引用一个属性文件,因此需要引用<context:property-placeholder location="classpath:api.properties" /> 行。这在单独运行客户端时有效,但在运行控制台程序时似乎被忽略(或找不到文件)。 api.properties 文件位于客户端打包 jar 的根目录中,jar 位于控制台程序的类路径中。我找到的唯一解决方法是将属性文件手动复制到控制台程序中,此时发现它没有任何问题。

4) 两个项目都有一个资源目录,其中包含子目录“dev”、“beta”和“prod”。这允许我根据要运行的 Maven 配置文件定义不同的属性。这适用于单个项目,但是当我打包客户端时,它只包含我正在运行的配置文件的属性文件(这是有道理的)。但是,这意味着如果我针对配置文件“beta”运行控制台项目,它仍将针对打包它的任何配置文件运行客户端。能够打包所有属性文件并让客户端在与依赖它的任何配置文件相同的配置文件中运行会很方便。这是可能的/一个好主意吗?

【问题讨论】:

    标签: java spring maven properties-file


    【解决方案1】:

    广告 1: 放置基于 JAR 的 XML 上下文的常见位置是在 META-INF/your/project/name 文件夹中。您可以检查例如 spring-batch-admin 项目。现在也更常见的是命名上下文文件 {name}-context.xml(例如 central-context.xml)。

    按照上面的建议,您应该不会遇到名称冲突的问题。但是,应该可以通过在 import 定义中使用 classpath* 伪协议来克服此类问题:

    <import resource="classpath*:do/not/put/in/root/this-can-be-duplicate.xml"/>
    

    广告 2: 这是完全合法的。您可以在上面链接的 Spring Batch Admin 示例中看到相同的做法。只需将classpath:classpath*: 添加到资源路径即可。

    广告 3:这很奇怪,我不知道那里发生了什么。

    广告 4:这可以通过Spring profiles(不是 Maven 配置文件)实现:

    <beans profile="dev">
        <context:property-placeholder location="classpath:META-INF/dev/my.properties"/>
    </beans>
    

    或通过新的SpEL 支持:

    <context:property-placeholder location="classpath:META-INF/#{systemProperties['my.jvm.property']}/my.properties"/>
    

    但是我喜欢的是拥有一个默认属性,然后让主应用程序能够覆盖它们。这意味着,您的配置将在一个地方,而不是在 JAR 中。您可以通过属性层次结构来实现这一点:

    <context:property-placeholder location="classpath:META-INF/my-default.properties,classpath*:META-INF/my-optional-overrides.properties"/>
    

    UPDATE 刚刚发现&lt;context:property-placeholder&gt;problems with SPeL。但是,在手动定义 PropertyPlaceholderConfigurer(即通过 &lt;bean&gt;)时,您仍然可以使用 SPeL(甚至是其他属性配置器)。

    【讨论】:

      猜你喜欢
      • 2014-04-16
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多