当前位置: 首页 > article >正文

maven项目打包后如何保留注释

项目场景:

maven项目打成jar包后没有注释了


原因分析:

        Maven打包后class文件中没有注释的原因主要是因为编译过程中注释信息不会被包含在class文件中。‌ 在Java编译过程中,注释信息不会被包含在生成的class文件中,这是因为注释信息主要用于开发时的参考,而不是运行时需要的信息。编译器的设计就是将源代码中的注释信息去除,只保留必要的编译后的代码。


解决方案:

如何在Maven项目中保留和使用注释:

  1. ‌生成源码jar包‌:可以通过使用Maven的maven-source-plugin插件来生成包含源代码的jar包。这样,开发者可以通过IDE或其他工具查看源代码时,能够看到原始的注释信息。
  2. 生成Javadoc jar包‌:使用maven-javadoc-plugin插件可以生成包含Javadoc的jar包。虽然这不会直接在class文件中保留注释,但可以在开发时提供文档支持,帮助理解代码。

在pom文件里 加上

<build>
	<plugins>
		<!-- 配置jar插件,确保javadoc JAR能和主代码JAR一起打包 -->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-jar-plugin</artifactId>
			<version>3.2.0</version>
		</plugin>
		<!--生成doc jar包-->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-javadoc-plugin</artifactId>
			<version>3.2.0</version>
			<executions>
				<execution>
					<id>attach-javadocs</id>
					<goals>
						<goal>jar</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
		<!--生成源码jar包-->
		<plugin>
			<groupId>org.apache.maven.plugins</groupId>
			<artifactId>maven-source-plugin</artifactId>
			<version>3.2.1</version>
			<executions>
				<execution>
					<id>attach-sources</id>
					<goals>
						<goal>jar</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>

 测试: 

比如有一个项目spring-boot-test,有个测试类并且包含注释:

package com.test.utils;

/**
 * 测试工具类
 */
public class TestUtil {
    /**
     * 打印内容
     * @param text  输入的内容
     * @return 内容
     */
    public static String print(String text){
        //方法内注释
        return text;
    }
}

pom 

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.test</groupId>
	<artifactId>spring-boot-test</artifactId>
	<version>0.0.1</version>
	<packaging>jar</packaging>
	
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.3.1.RELEASE</version>
		<relativePath />
	</parent>
	
	<properties>
		<!-- 跳过测试 -->
		<skipTests>true</skipTests>
	</properties>
	
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter</artifactId>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<!-- 配置jar插件,确保javadoc JAR能和主代码JAR一起打包 -->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-jar-plugin</artifactId>
				<version>3.2.0</version>
			</plugin>
			<!--生成doc jar包-->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-javadoc-plugin</artifactId>
				<version>3.2.0</version>
				<executions>
					<execution>
						<id>attach-javadocs</id>
						<goals>
							<goal>jar</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
			<!--生成源码jar包-->
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-source-plugin</artifactId>
				<version>3.2.1</version>
				<executions>
					<execution>
						<id>attach-sources</id>
						<goals>
							<goal>jar</goal>
						</goals>
					</execution>
				</executions>
			</plugin>
		</plugins>
	</build>
</project>

 这时候使用idea打包,点击package或者install

 package 和 install 打包的区别:

  • package :只会在项目本地的 target 目录中生成jar包,而不会将它们安装到本地maven仓库中。
  • install:install 阶段的作用是在 package 阶段的基础上,再将打包好的构件安装到本地 Maven 仓库中(默认路径是 ~/.m2/repository)。所以,mvn install 包含了 mvn package 所做的所有事情,但还额外将构件安装到本地仓库,确保其他项目可以依赖和使用它。

我们因为要测试使用这个jar包,所以用install打包,我们会发现maven仓库下生了jar、javadoc、sources

这时候其他maven项目就可以引用这个jar包使用 

<dependency>
	<groupId>com.test</groupId>
	<artifactId>spring-boot-test</artifactId>
	<version>0.0.1</version>
</dependency>

然后使用里面的方法

package com.test;

import com.test.utils.TestUtil;

public class TestPrint {
    public static void main(String[] args) {
        System.out.println(TestUtil.print("测试"));;
    }
}

鼠标悬停可以看到注释

 

点击方法内可以查看源码

 


http://www.kler.cn/a/453383.html

相关文章:

  • Postman接口测试01|接口测试基础概念、http协议、RESTful风格、接口文档
  • NLP 中文拼写检测纠正论文 C-LLM Learn to CSC Errors Character by Character
  • Docker 镜像加速访问方案
  • 关于Edge浏览器的设置
  • EasyExcel 模板+公式填充
  • 顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)
  • 振动分析-47-振动信号处理能力提升需要理解和掌握的算法知识体系
  • Bogus:.NET的假数据生成利器
  • Centos7中使用yum命令时候报错 “Could not resolve host: mirrorlist.centos.org; 未知的错误“
  • 2022 年 12 月青少年软编等考 C 语言四级真题解析
  • Docker基础知识 Docker命令、镜像、容器、数据卷、自定义镜像、使用Docker部署Java应用、部署前端代码、DockerCompose一键部署
  • 单机和微服务的区别,微服务有什么问题?数据一致性问题怎么解决?幂等问题怎么解决?
  • c++ 类似与c# 线程 AutoResetEvent 和 ManualResetEvent的实现
  • FPGA自学之路:到底有多崎岖?
  • 【ES6复习笔记】Class类(15)
  • 【解决报错】AttributeError: ‘NoneType‘ object has no attribute ‘group‘
  • Goland 安装与使用
  • 请购单一直提示需求部门不能为空无法提交
  • 深入浅出 MyBatis | Mybatis 简洁、第一个Mybatis程序
  • Flutter开发HarmonyOS 鸿蒙App的好处、能力以及把Flutter项目打包成鸿蒙应用
  • 使用TimesFM 对车辆销售进行预测
  • 【深度学习环境】NVIDIA Driver、Cuda和Pytorch(centos9机器,要用到显示器)
  • 社区版Dify 轻松实现文生图,Dify+LLM+ComfyUI
  • Coroutine 基础三 —— 结构化并发(二)
  • 机器学习之PCA降维
  • 【开发问题记录】使用 Docker+Jenkins+Jenkins + gitee 实现自动化部署前端项目 CI/CD(centos7为例)