IDEA 2020.02 中使用 Maven 打包jar(不含引用依赖,含引用依赖)

最近在idea中使用maven打包一个jar,各种踩坑,记录如下。

首先,本次的项目是 含maven的java普通项目

踩坑开始。

第一个就是,java: 程序包com.sun.istack.internal不存在

这是因为我在项目中引用了。

import com.sun.istack.internal.NotNull;

这个类。

解决办法,如下。

在 pom.xml 找到。

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
</plugin>

改为:

<plugin>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.0</version>
    <configuration>
        <compilerArgs>
            <!-- 过期的方法的警告-->
            <arg>-Xlint:deprecation</arg>
        </compilerArgs>
        <compilerArguments>
            <!-- 是否输出所有的编译信息(包括类的加载等)-->
            <!--<verbose />-->
            <!-- 解决maven命令编译报错,因为rt.jar 和jce.jar在jre的lib下面,不在jdk的lib下面,
            导致maven找不到(java7以后会出现这个问题),将这2个jar包拷贝到jdk的lib下面估计也好使-->
            <bootclasspath>${java.home}\lib\rt.jar;${java.home}\lib\jce.jar</bootclasspath>
        </compilerArguments>
    </configuration>
</plugin>

完美解决。


打包jar(不含依赖)

直接按下图操作。

因为 maven-archetype-quickstart 中已经包含了一系列常用的插件,其中就有 maven-jar-plugin 所以可以直接按上图打包jar

生成的 jar 会在 项目名/target/项目名.jar 中 。


打包jar(含依赖,踩坑重点)

关于在Maven中的 pluginManagement 请点击查看。

初次使用maven的不太知道这些,一般都会直接在 pom.xml build->pluginManagement 子项下直接这么写。然后,就没有然后了...也就是始终无法将引用的依赖一起打包到 jar 中。

伪代码:

<build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
        <plugins>

            ...

            <plugin>
                <artifactId>maven-assembly-plugin</artifactId>
                <version>3.3.0</version>
                <executions>
                    <execution>
                        <phase>package</phase><!-- 绑定到package生命周期阶段上 -->
                        <goals>
                            <goal>single</goal><!-- 只运行一次 -->
                        </goals>
                    </execution>
                </executions>
                <configuration>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependencies</descriptorRef>
                    </descriptorRefs>
                </configuration>
            </plugin>
        </plugins>
    </pluginManagement>
</build>

因为 pluginManagement 后面有这一段提示。

<!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->

所以,解决办法:可以在 build 中添加一个未加锁的 <plugins></plugins>

伪代码:

<build>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
        ...
    </pluginManagement>

    <!-- 自定义导入plugins -->
    <plugins>
        <plugin>
            <artifactId>maven-assembly-plugin</artifactId>
            <version>3.3.0</version>
            <executions>
                <execution>
                    <phase>package</phase><!-- 绑定到package生命周期阶段上 -->
                    <goals>
                        <goal>single</goal><!-- 只运行一次 -->
                    </goals>
                </execution>
            </executions>
            <configuration>
                <descriptorRefs>
                    <descriptorRef>jar-with-dependencies</descriptorRef> <!-- 默认描述文件 -->
                </descriptorRefs>
                <!--<descriptor>assembly.xml</descriptor>--> <!-- 自定义描述文件 -->
            </configuration>
        </plugin>
    </plugins>
</build>

然后再双击运行 package 执行打包(记得 clean),关于自定义描述文件,可看 这篇文章 。


成功含赖打包

第二个 -jar-with-dependencies.jar 就是带有依赖的jar了。

猜你喜欢

转载自blog.csdn.net/AoXue2017/article/details/110841814