【问题标题】:Shrink my huge 100MB jar file (spring boot maven plugin)缩小我巨大的 100MB jar 文件(spring boot maven 插件)
【发布时间】:2017-04-23 22:36:04
【问题描述】:

我想构建我的 Spring Boot 应用程序,但我必须将很多文件传输到不同的服务器。但是我的“jar”文件中的“libs”文件夹现在太大了。它是 100MB++。

我想要的是定期更新我的 webapp,比如 1MB 或其他东西,并在不同服务器的输出目录中保留我的 100MB“libs”文件夹的副本。很少更新库。

以下 POM 文件创建一个 100MB 的 JAR...,然后创建 100MB 的“libs”文件夹。然后将两者拉在一起。但是我不知道如何使 100MBJAR 更小(哪些 springboot 库最重要的是要一起编译?)。我想我需要一个<include> 标签之类的。

但我还没有找到正确的方法来配置“spring boot maven 插件”,使其仅包含 SpringBoot 和 TomCat Embedded 中最重要的文件,但将大部分其他库保留在外部在不同的文件夹中。

(我的底部)POM.xml

<build>
        <resources>
            <resource>
                <directory>${project.basedir}/src/main/resources</directory>
                <excludes>
                    <exclude>node_modules/**</exclude>
                    <exclude>bower_components/**</exclude>
                    <exclude>node/**</exclude>
                </excludes>
            </resource>
            <resource>
                <directory>${project.build.directory}/generated-resources</directory>
            </resource>
        </resources>
        <pluginManagement>
            <plugins>
                <!--This plugin's configuration is used to store Eclipse m2e settings 
                    only. It has no influence on the Maven build itself. -->
                <plugin>
                    <groupId>org.eclipse.m2e</groupId>
                    <artifactId>lifecycle-mapping</artifactId>
                    <version>1.0.0</version>
                    <configuration>
                    </configuration>
                </plugin>   
            </plugins>
        </pluginManagement>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-dependency-plugin</artifactId>
                <version>3.0.0</version>                    
                <configuration>
                   <projectNameTemplate>[groupId].[artifactId]</projectNameTemplate>
                </configuration>
                <executions>
                    <execution>
                        <id>copy-dependencies</id>
                        <phase>prepare-package</phase>
                        <goals>
                          <goal>copy-dependencies</goal>
                        </goals>
                        <configuration>
                          <outputDirectory>${project.build.directory}/${project.build.finalName}.lib</outputDirectory>
                        </configuration>
                    </execution>
                </executions>                   
              </plugin>
              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-jar-plugin</artifactId>
                  <configuration>
                    <archive>
                      <manifest>
                        <addClasspath>true</addClasspath>
                        <classpathPrefix>${project.build.finalName}.lib/</classpathPrefix>
                        <mainClass>${fully.qualified.main.class}</mainClass>
                      </manifest>
                    </archive>
                  </configuration>
              </plugin>
              <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-antrun-plugin</artifactId>
                  <executions>
                    <execution>
                      <id>antrun-archive</id>
                      <phase>package</phase>
                      <goals>
                        <goal>run</goal>
                      </goals>
                      <configuration>
                        <target>
                          <property name="final.name" value="${project.build.directory}/${project.build.finalName}"/>
                          <property name="archive.includes" value="${project.build.finalName}.${project.packaging} ${project.build.finalName}.lib/*"/>
                          <property name="tar.destfile" value="${final.name}.tar"/>
                          <!-- <zip basedir="${project.build.directory}" destfile="${final.name}.zip" includes="${archive.includes}" /> -->
                          <tar basedir="${project.build.directory}" destfile="${tar.destfile}" includes="${archive.includes}" />
                          <gzip src="${tar.destfile}" destfile="${tar.destfile}.gz" />
                          <!-- <bzip2 src="${tar.destfile}" destfile="${tar.destfile}.bz2" /> -->
                        </target>
                      </configuration>
                    </execution>
                  </executions>
              </plugin>
        </plugins>
    </build>

【问题讨论】:

  • 我宁愿寻找使用rsync 和/或创建二进制增量文件,因为您正在与 Spring Boot 的基本思想作斗争——拥有一个自给自足的 JAR 文件。另一种选择是将独立的 Tomcat 服务器与 Spring MVC 应用程序一起使用,并将一些依赖项标记为 runtime 以告诉 Maven 不要将它们包含在 JAR 文件中。

标签: maven spring-boot spring-boot-maven-plugin


【解决方案1】:

在 spring-boot-maven-plugin 和逗号分隔的 groupID 列表中添加了“excludeGroupIds”,并且它起作用了。将其从核心罐中取出。

记住这是非标准的,不应该这样做,因为它违背了 SpringBoot 的目的(所以不妨使用 Java Spark2 框架或更现代的东西,然后单独配置 Tomcat),或者只是发送100MB 包过。但这在此处是必要的,因为连接速度很慢。

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 2014-06-20
    • 2019-08-12
    • 1970-01-01
    • 1970-01-01
    • 2021-11-28
    • 2017-03-26
    • 2016-01-16
    相关资源
    最近更新 更多