我刚刚使用spring boot来开发一个非web项目,实际上是一个用作shell脚本的简单项目,只需通过RestTemplate
访问一个url然后发送电子邮件到某个机构,告诉他们{{1}的结果} template。
起初我只是依赖
Freemaker
然后构建可执行jar(mvn包),它非常大,有17M。 然后经过多次尝试,现在依赖是
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
即便如此,可执行jar仍然很大,有12M。
可以以任何方式存在减少可执行jar大小吗?毕竟它是一个非常小的项目只有几个小类。
另外,可能存在一些通过spring boot创建shell脚本的最佳实践,现在为此我禁用了这些东西
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
</dependency>
<dependency>
<groupId>org.freemarker</groupId>
<artifactId>freemarker</artifactId>
</dependency>
并禁用记录器
spring.main.web-environment=false
spring.main.banner_mode=off
spring.devtools.livereload.enabled=false
spring.jmx.enabled=false
可以有一些最佳实践来通过spring boot创建shell脚本吗?
答案 0 :(得分:0)
为了减小jar大小,您始终可以开始排除所有不会使用的依赖项。您可以使用mvn dependency:tree
列出项目的依赖项。
由于Spring Boot提供了大量的默认设置,因此默认情况下也会提取许多依赖项,因此请检查您正在使用的内容,这是您不需要的,但请注意您的内容是什么不包括
<强>更新强>
为了能够访问命令行参数,在参考文档中说明了如何执行此操作:
默认情况下,SpringApplication将转换任何命令行选项 参数(以' - '开头,例如--server.port = 9000)到属性 并将其添加到Spring环境中。如上所述,命令行 属性始终优先于其他属性源。
为了实现您的需求,您需要按照以下步骤操作:
1)创建一个处理这些属性的bean,然后执行所需的所有逻辑,在您的情况下,发送电子邮件。
检索这些属性的一种方法是使用@Value
注释,例如,检索上一个示例中提到的属性:
@Service
public class Service {
@Value("${server.port}")
private Integer port;
// rest of the code that injects/executes the sending email bit
}
但是,如果您没有将值注入String
,则在调用应用程序时,如果没有以有效格式提供,则需要注意可能的类型转换问题。
2)在应用程序启动后执行该服务,这可以通过声明@Bean
CommandLineRunner
或通过使服务实现该接口来完成。
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
CommandLineRunner someMeaningfulMethodName( Service service ) {
return args -> {
// execute your code here, using the injected Service
};
}
}
请注意,通过将您的逻辑作为参数传递服务,您将服务注入到bean中。
3)执行完成后终止spring boot应用程序。为此,您需要关闭应用程序上下文。我个人自己也没有这样做,但是在这里找到了这个answer来解释如何这样做。
您可能希望在CommandLineRunner
bean的末尾执行该操作。
更新2
使用此方法时要记住的一个注意事项是,每次执行应用程序时,都是每次都在初始化应用程序上下文。
我想要指出的是,如果您计划发送一批电子邮件,例如1000封电子邮件,您将启动应用程序1000次,如果启动需要6秒,你将花费6000秒来启动应用程序1000次。再加上它,关闭它并发送一封电子邮件所需的时间。