传递依赖:覆盖依赖不起作用的方式

时间:2014-07-18 18:29:54

标签: java spring maven spring-3

我正在与Maven和Spring合作。

我有很多项目要用于其他项目的传递依赖。

我有 01CentralDomainBasic 项目

<groupId>com.manuel.jordan.centraldomain</groupId>
<artifactId>central-domain-basic</artifactId>
<packaging>jar</packaging>
<name>01CentralDomainBasic</name>
<version>01</version>

它包含 com.manuel.jordan.domain 包和一些实体

我有 01CentralRepositoryCommonBasic 项目

<groupId>com.manuel.jordan.centralrepository</groupId>
<artifactId>central-repository-common-basic</artifactId>
<packaging>jar</packaging>
<name>01CentralRepositoryCommonBasic</name>
<version>01</version>
…
<dependencies>
    <dependency>
        <groupId>com.manuel.jordan.centraldomain</groupId>
        <artifactId>central-domain-basic</artifactId>
        <version>01</version>
    </dependency>                                           
</dependencies>

它包含 com.manuel.jordan.model.repository 包和一些存储库接口ProductRepository的方式。 (Only interface definitions)它们在其他模块/项目中实现。

我有 01CentralRepositoryDataJpaBasic 项目

<groupId>com.manuel.jordan.centralrepository</groupId>
<artifactId>central-repository-data-jpa-basic</artifactId>
<packaging>jar</packaging>
<name>01CentralRepositoryDataJpaBasic</name>
<version>01</version>
…
<dependencies>
    <dependency>
        <groupId>com.manuel.jordan.centraldomain</groupId>
        <artifactId>central-domain-basic</artifactId>
        <version>01</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.data</groupId>
        <artifactId>spring-data-jpa</artifactId> 
        <!-- Version handle through a <parent> -->
    </dependency>       
</dependencies>

它包含 com.manuel.jordan.model.repository 包和一些存储库接口ProductRepository的方式。 是的,相同的包和接口文件命名上一个项目的方式但请记住(through Spring Data JPA, Spring implements the interface internally)因此每个文件的内容都不同。我不需要其他模块/项目来实现,因为Spring为我做了那份工作。

我有 01CentralServiceBasic 项目

<groupId>com.manuel.jordan.centralservice</groupId>
<artifactId>central-service-basic</artifactId>
<packaging>jar</packaging>
<name>01CentralServiceBasic</name>
<version>01</version>
…
<dependencies>
    <dependency>
        <groupId>com.manuel.jordan.centraldomain</groupId>
        <artifactId>central-domain-basic</artifactId>
        <version>01</version>
    </dependency>
</dependencies>

它包含 com.manuel.jordan.model.service 包和一些 services 接口的ProductService。再次(Only interface definitions)它们在其他模块/项目中实现(以下)。

我有 01CentralServiceImplBasic 项目

<groupId>com.manuel.jordan.centralservice</groupId>
<artifactId>central-service-impl-basic</artifactId>
<packaging>jar</packaging>
<name>01CentralServiceImplBasic</name>
<version>01</version>
…
<dependencies>
    <dependency>
        <groupId>com.manuel.jordan.centralservice</groupId>
        <artifactId>central-service-basic</artifactId>
        <version>01</version>
    </dependency>
    <dependency>
        <groupId>com.manuel.jordan.centralrepository</groupId>
        <artifactId>central-repository-common-basic</artifactId>
        <version>01</version>
        <scope>provided</scope>
    </dependency>
    …
</dependencies>

它取决于并且需要服务和存储库接口。

注意:只有编译目的才需要存储库接口。

现在要执行两个最终项目。

名为 01HibernatePersistence

的项目
<groupId>com.manuel.jordan.persistence</groupId>
<artifactId>hibernate-persistence</artifactId>
<packaging>jar</packaging>
<name>01HibernatePersistence</name>
…
<dependencies>
    …
    <dependency>
        <groupId>com.manuel.jordan.centralrepository</groupId>
        <artifactId>central-repository-hibernate-impl-basic</artifactId>
        <version>01</version>
    </dependency>
    <dependency>
        <groupId>com.manuel.jordan.centralservice</groupId>
        <artifactId>central-service-impl-basic</artifactId>
        <version>01</version>
    </dependency>
    …
</dependencies>

直到这里一切都很完美

问题在于我的 01DataJpaPersistence 项目

<groupId>com.manuel.jordan.persistence</groupId>
<artifactId>data-jpa-persistence</artifactId>
<packaging>jar</packaging>
<name>01DataJpaPersistence</name>
…
<dependencies>
    <dependency>
        <groupId>com.manuel.jordan.centralservice</groupId>
        <artifactId>central-service-impl-basic</artifactId>
        <version>01</version>
        <exclusions>
            <exclusion>
                <groupId>com.manuel.jordan.centralrepository</groupId>
                <artifactId>central-repository-common-basic</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>com.manuel.jordan.centralrepository</groupId>
        <artifactId>central-repository-data-jpa-basic</artifactId>
        <version>01</version>
    </dependency>
</dependencies>

central-service-impl-basic 仅需要存储库接口用于编译目的,它可以是 central-repository-common-basic central- repository-data-jpa-basic ,我选择了 central-repository-common-basic

在前面的代码中, central-repository-common-basic 被排除在外,并且使用了 central-repository-data-jpa-basic (它具有相同的包和接口文件 Spring在内部实现了幕后的各自实现。

因此:

  • 相同<groupId>(com.manuel.jordan.centralrepository)
  • 不同<artifactId>(central-repository-common-basic和central-repository-data-jpa- basic)
  • 相同java package(com.manuel.jordan.model.repository)
  • 相同的ProductRepository界面,但当然有不同的内容

但它不起作用,我收到以下错误消息:

Exception in thread "main" java.lang.NoSuchMethodError: 
com.manuel.jordan.model.repository.ProductRepository.save
(Lcom/manuel/jordan/domain/Product;)Lcom/manuel/jordan/domain/Product;
at 
com.manuel.jordan.model.service.impl.ProductServiceImpl.save(ProductServiceImpl.java:45)

如果我依赖:树我得到

[INFO] +- com.manuel.jordan.centralfactory:central-factory-basic:jar:01:compile
[INFO] |  +- com.manuel.jordan.centraldomain:central-domain-basic:jar:01:compile
[INFO] |  \- joda-time:joda-time:jar:2.3:compile
[INFO] +- com.manuel.jordan.centralservice:central-service-impl-basic:jar:01:compile
[INFO] |  +- com.manuel.jordan.centralservice:central-service-basic:jar:01:compile
[INFO] |  +- org.springframework:spring-tx:jar:4.0.5.RELEASE:compile
[INFO] |  +- org.slf4j:slf4j-api:jar:1.7.7:compile
[INFO] |  \- org.slf4j:slf4j-log4j12:jar:1.7.7:runtime
[INFO] |     \- log4j:log4j:jar:1.2.17:runtime
[INFO] +- com.manuel.jordan.centralrepository:central-repository-data-jpa-basic:jar:01:compile

排除工作如何预期,其他预期的依赖性仍然存在并出现,但根据错误堆栈跟踪似乎已被忽略。

缺少什么?

提前致谢

奥米克

01CentralRepositoryCommonBasic 项目

package com.manuel.jordan.model.repository;

import java.util.List;

import com.manuel.jordan.domain.Product;

public interface ProductRepository {

    Product save(Product product);

    Product findOne(Integer id);
    Long count();
    List<Product> findAll();

    Product update(Product product);

    void delete(Integer id);
    void delete(Product product);

}

01CentralRepositoryDataJpaBasic 项目

package com.manuel.jordan.model.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.manuel.jordan.domain.Product;

public interface ProductRepository extends JpaRepository<Product,Integer> {

}

同样的包和相同的界面,但内容不同。

01CentralServiceImplBasic 项目

package com.manuel.jordan.model.service.impl;

…    
import com.manuel.jordan.model.repository.ProductRepository;

@Transactional
@Scope("prototype")
@Service("productService")
public class ProductServiceImpl implements ProductService {

    private ProductRepository productRepository; 

    @Autowired
    public ProductServiceImpl(ProductRepository productRepository){
        this.productRepository = productRepository;
    }

您如何看待,此服务类仅取决于 ProductRepository

其他项目,例如:

  • 01HibernatePersistence,取决于名为01CentralRepositoryHibernateImplBasic的其他模块/项目,当然它实现了01CentralRepositoryCommonBasic项目的接口(上面已经共享了pom.xml)
  • 01DataJpaPersistence,不依赖于其他模块/项目,因为Spring直接在幕后实现(pom.xml已在上面共享)。

0 个答案:

没有答案