使用 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个重要文件。它们是FooLibraryInterface
和FooLibraryConfiguration
。在这个例子中我不会使用FooLibraryInterface
。
FooLibraryInterface
是一个接口,其中包含客户端可能需要的重要方法override
和FooLibraryConfiguration
以扫描和注入在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
.或者您可以一起扫描所有文件(留下单独的扫描来自 @EnableJpaRepositories 或 em.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 应用程序