可以有一些最佳实践来通过spring boot创建shell脚本并减少可执行jar大小?

时间:2016-01-04 10:18:18

标签: spring-boot

我刚刚使用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脚本吗?

1 个答案:

答案 0 :(得分:0)

为了减小jar大小,您始终可以开始排除所有不会使用的依赖项。您可以使用mvn dependency:tree列出项目的依赖项。

由于Spring Boot提供了大量的默认设置,因此默认情况下也会提取许多依赖项,因此请检查您正在使用的内容,这是您不需要的,但请注意您的内容是什么不包括

<强>更新

为了能够访问命令行参数,在参考文档中说明了如何执行此操作:

  

默认情况下,SpringApplication将转换任何命令行选项   参数(以' - '开头,例如--server.port = 9000)到属性   并将其添加到Spring环境中。如上所述,命令行   属性始终优先于其他属性源。

source

为了实现您的需求,您需要按照以下步骤操作:

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次。再加上它,关闭它并发送一封电子邮件所需的时间。