使用 Maven 部署 Spring-Boot 项目并进一步将其导入其他项目

Posted

技术标签:

【中文标题】使用 Maven 部署 Spring-Boot 项目并进一步将其导入其他项目【英文标题】:Deploying a Spring-Boot project using Maven and further importing it in other projects 【发布时间】:2021-02-09 17:33:51 【问题描述】:

所以目前,我有两个项目,比如说 Storefront 和 Dashboard,这两个项目都有相同的 POJO 类、服务和一些 API 端点。例如,考虑一个类 Student,我们在 Storefront 和 Dashboard 中都有这个类及其服务类。此外,在不久的将来,我们将为客户实施另一个项目,即客户端仪表板,它将拥有几乎 90% 的相同资源。

所以我想,如果我创建一个包含所有项目所需的所有库的 maven 项目并根据需要导入它们会怎样。这将减少冗余,也将减轻其他项目的重量。我以前使用过项目内存储库和 Dropbox 作为 maven 存储库,所以这次对我来说会更容易一些。

现在的问题是:我有 StudentRepository 对应于 Student,它进一步与 '@Autowired' 注释一起使用对吗?据我所知,当我运行“@SpringBootApplication”时,一切都会正常工作,但正如我之前提到的,我将导入这些包,并且这样做,程序将通过 NullPointerException 导致 StudentRepository 的实例为空。

@SpringBootApplication
@EnableAutoConfiguration
@EntityScan
public class DemoApplication implements CommandLineRunner 

    private Logger logger = LoggerFactory.getLogger(this.getClass());

    @Autowired
    StudentRepository repository;

    public static void main(String[] args) 
        SpringApplication.run(PaperTrueLibrariesApplication.class, args);
    

    @Override
    public void run(String... args) throws Exception 
        // This will work
        logger.info("Inserting -> ", repository.save(new Student("studentName", "primaryKey")));
    
    
    // This won't
    public void addAStudent(String studentName, String primaryKey) 
        repository.save(new Student(studentName, primaryKey));
    


public class Test 

    public static void main(String[] args) 
        // This will throw a NullPointerException
        new DemoApplication().addAStudent("yourNameProbably", "yourSocialSecurityNumber");
    


那么还有其他方法可以使这项工作吗?任何建议将不胜感激,并提前致谢。

【问题讨论】:

问题不是很清楚,我重新表述一下所以当你在另一个项目中导入这个项目时,StudentRepository会因为@Autowired而为空? 【参考方案1】:

有两种方法可以实现你想要的-

首先,在当前项目中添加您已经在构建文件中创建的所需 jar,比如 maven 的 pom.xml。

如果您在不同项目中导入的类或代码不是spring bean,那么

在您的配置类中,使用 @Bean 注释将其作为 bean 返回。

@Configuration
public class YourConfigurationClass     

@Bean
SomeBean returnSomeBean() 
    return new SomeBean();

如果你的类已经是一个 spring bean,你只需要让 spring 扫描所需的包,因为你已经通过在 maven 中添加依赖项在你的类路径中拥有它。

@Configuration
@ComponentScan("com.yourpackage.fromCommanCodeJar")
public class YouApplicationConfigurationClass ....

【讨论】:

谢谢,我会试试这个,让你知道结果如何。【参考方案2】:

假设您有一个库FooLibrary 和主应用程序FooApplication。这个想法是在FooApplication 中导入FooLibrary

让我们从FooLibrary 开始。所以主要有2个重要文件。它们是FooLibraryInterfaceFooLibraryConfiguration。在这个例子中我不会使用FooLibraryInterface

FooLibraryInterface 是一个接口,其中包含客户端可能需要的重要方法overrideFooLibraryConfiguration 以扫描和注入在FooLibrary 中找到的bean。所以,接下来就是

public interface FooLibraryInterface 
    public abstract Datasource configureDatabaseConnection();

FooLibraryConfiguration 将如下所示:

@Configuration
@ComponentScan("package.to.scan")
public class FooLibraryConfiguration 
    @Bean
    public YourBean beanName() 
        return new YourBean();
    

您可以在FooLibrary 中添加您需要的所有内容。现在我们的库已准备好在FooApplication 的帮助下导入FooLibraryConfiguration

@SpringBootApplication
@Import(FooLibraryConfiguration.class) //this will import all the beans defined in the library
public class FooApplication 
    public static void main(String[] args) 
        SpringApplication.run(FooApplication.class, args);
    

注意:如果您有 EntityManager 托管类(实体,存储库),您应该对主应用程序中的 lib 包进行额外扫描,因为我们不需要为单个应用程序使用不同的 EntityManager .或者您可以一起扫描所有文件(留下单独的扫描来自 @EnableJpaRepositoriesem.setPackagesToScan("library.entities.package");@ComponentScan("base.library.package")

@Configuration
@EnableJpaRepositories(basePackages =  "library.repository.package" )
@EnableTransactionManagement
public class PersistenceConfig 
    @Bean
    public LocalContainerEntityManagerFactoryBean entityManagerFactory() 
        LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
        em.setDataSource(dataSource());
        em.setPackagesToScan("library.entities.package");

        JpaVendorAdapter vendorAdapter = new HibernateJpaVendorAdapter();
        em.setJpaVendorAdapter(vendorAdapter);
        em.setJpaProperties(additionalProperties());

        return em;
    
    .....

更新

谢谢@keshavram-kuduwa,您可以通过https://spring.io/guides/gs/multi-module/#_create_the_library_project联系弹簧指南

【讨论】:

感谢您的时间和耐心阿曼,我一定会尝试这个,让你知道它是怎么回事。 按照你的指示,我跟着spring.io/guides/gs/multi-module/#_create_the_library_project。再次感谢。

以上是关于使用 Maven 部署 Spring-Boot 项目并进一步将其导入其他项目的主要内容,如果未能解决你的问题,请参考以下文章

如何在不包含所有spring-boot库的情况下将spring-boot应用程序部署到nexus?

win10环境下使用docker部署spring-boot项目

Spark maven 依赖破坏了 spring-boot 应用程序

如何使用 maven 部署 JavaFX 项目,包括自定义和非模块化依赖项?

spring-boot系列:初试spring-boot

spring-boot 需要启动nginx吗