我正在与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 。
其他项目,例如: