【问题标题】:Importing only a few class from a dependency从依赖项中只导入几个类
【发布时间】:2014-07-01 15:38:31
【问题描述】:

我正在开发一个使用 maven 的模块化网络应用程序。 我的应用程序的框架如下:

带有共享服务模块的应用程序框架

现在我想在 Service-App2 中导入一些 Service-App1 类,但没有 Service-App1 依赖项(如 Module-App1、Util-App1 和外部依赖项)。

总结一下,因为在 App2 中我有一个复合持久性单元Composite Persistence Unit,我想在应用程序之间共享一些业务逻辑。例如,如果在 App1 我有这样的弹簧服务:

public interface ContractService {

    void processSomethings();

}

@Service
public class ContractServiceImpl implements ContractService  {

    public void processSomethings(){
            //Manage some share entities

    }


}

我想用这个方法

processSomethings()

也在 App1 中 我怎样才能意识到这一点?

【问题讨论】:

  • 如果你需要单独创建一个单独的模块(maven模块)并使用它。
  • @khmarbaise 我还想制作一个单独的模块(共享服务),但你可以建议如何将它放在我的骨架中(从谁依赖,继承以及什么项目是子模块)

标签: java spring maven maven-3


【解决方案1】:

您需要创建一个项目(jar 输出),其中仅包含两个消费者之间共享的类。这可能看起来像一个开销,但它会导致干净的组织良好的代码。如果你不能这样做,这表明你有一个混乱的依赖层次结构。我定期这样做是为了实现 Web 服务客户端和服务,使用包含公共类的共享 jar(即客户端应该对 DAO 类一无所知,但确实需要知道 Web 服务操作的签名。它还需要可以访问定义数据和消息结构的 POJO 类)。

另外,你在运行时需要 hamcrest 依赖吗?我的经验是,它通常可以将其范围设置为测试,因此它永远不会出现在您编译的工件中。

我不是父 pom 的转换者,当然不会考虑您展示的两级父 pom 结构。我的反对意见是:

  • 如果更新父 pom,则需要更新所有使用它的子 pom,从而抵消了集中依赖信息的优势。
  • 将模块声明放在父 pom 中似乎会产生循环引用。如果您更改父 pom,它会尝试编译模块,这些模块会立即引用父级,由于尚未完成构建,因此在存储库中尚不可用。我见过有“依赖父级”和“编译所有模块父级”的系统来解决这个问题。我确实很少使用父 pom,但仅用于设置编译器版本和定义外部依赖项的版本,例如 Spring 和 Apache commons jars。

我想听听关于这个话题的合理论证。

【讨论】:

  • @kiviron 我使用了两级父 pom 为什么 App1-Parent 包含与 App2-Parent 不同的外部依赖项(例如不同的 spring 版本和外部依赖项)。相反,对于我的主要问题,我用我的新结构更新了我的问题。但现在这是如何在我的项目中导入这个新模块(外部依赖或子模块)。你能帮我把你的应用程序的骨架吗?
【解决方案2】:

您需要将<exclusions> 部分添加到您的maven 依赖项中,并列出您不想继承的传递依赖项。

例如,如果我的 pom.xml 有一个如下所示的 <dependencies> 部分:

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
  </dependency>
</dependencies>

...然后当我执行mvn dependency:tree 时,我得到以下输出:

[INFO] ------------------------------------------------------------------------
[INFO] Building scratch 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ scratch ---
[INFO] com.nppc.mes:scratch:jar:0.0.1-SNAPSHOT
[INFO] \- junit:junit:jar:4.11:test
[INFO]    \- org.hamcrest:hamcrest-core:jar:1.3:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

如果我决定我真的不想在我的项目中使用 hamcrest-core 依赖项,我可以修改我的 pom.xml 以排除它,如下所示:

<dependencies>
  <dependency>
    <groupId>junit</groupId>
    <artifactId>junit</artifactId>
    <version>4.11</version>
    <scope>test</scope>
    <exclusions>
      <exclusion>
        <groupId>org.hamcrest</groupId>
        <artifactId>hamcrest-core</artifactId>
      </exclusion>
    </exclusions>
  </dependency>
</dependencies>

...这给了我mvn dependency:tree 的输出:

[INFO] ------------------------------------------------------------------------
[INFO] Building scratch 0.0.1-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:2.8:tree (default-cli) @ scratch ---
[INFO] com.nppc.mes:scratch:jar:0.0.1-SNAPSHOT
[INFO] \- junit:junit:jar:4.11:test
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------

【讨论】:

  • 排除仅适用于工件或换句话说 jar 文件,但不适用于类级别。
  • @khmarbaise OP特别提到他要排除Module-App1和Util-App1,根据他的图是.jar文件。
【解决方案3】:

我不认为你可以,我当然希望不会。

OO 编程的思想之一是封装,其中包括隐藏您正在使用的类的实现细节的思想。您不应该知道它依赖于哪些类,尽管您应该能够发现它使用哪些库。但是为了使用库中的类,你不应该只从你决定需要的库中挑选类;无法保证您确实需要的那些会起作用。

【讨论】:

  • 也许我没有让自己理解,我更新了我的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多