仅从依赖项导入几个类

时间:2014-07-01 15:38:31

标签: java spring maven maven-3

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

enter image description here

我的应用程序的骨架与共享服务模块

enter image description here

现在我想在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中 我怎么能意识到这一点?

3 个答案:

答案 0 :(得分:1)

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

OO编程的一个想法是封装,其中包括隐藏您正在使用的类的实现细节的想法。您不应该知道它依赖于哪些类,尽管您应该能够发现它使用的库。但是为了在库中使用该类,您不应该只从库中挑选出您认为需要的类;我们无法保证你所需要的人能够工作。

答案 1 :(得分:1)

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

例如,如果我的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] ------------------------------------------------------------------------

答案 2 :(得分:1)

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

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

我不是转换为父母poms,当然也不会考虑你展示的两级父pom结构。我的反对意见是:

  • 如果更新父pom,则需要更新使用它的所有子pom,否定集中依赖关系信息的优势。
  • 将模块声明放在父pom中似乎会产生循环引用。如果您更改父pom,它会尝试编译模块,这些模块会立即返回到父模块,该模块尚未在存储库中可用,因为它尚未完成构建。我已经看到系统中存在“依赖父级”和“编译所有模块父级”来解决此问题。我很少使用父poms,但只是设置编译器版本并定义外部依赖项的版本,如Spring和Apache commons jar。

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