关于自定义程序打包成jar包,并读取配置

这篇具有很好参考价值的文章主要介绍了关于自定义程序打包成jar包,并读取配置。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在实际开发过程中,我们有时候有把你编写的一段程序打成jar包的需求,而一些配置是需要去配置文件里面读取关于这项目的一些配置,本人在网络上查询了众多的资料,总的来说可以归为3类

1.从数据库读取配置

   老生常谈,在dao层从数据库获取配置信息,然后返回到Service层进行业务逻辑处理

2.在每次调用这个jar的时候通过关键字去读取配置

  在这一类中,方法有很多,不过大体都是

InputStream ins = getClass().getResourceAsStream("/resource/dbconfig.properties");

  通过IO流对配置文件进行读取,然后再从 InputStream 流中读取数据,没什么技术含量,便不多讲

例如以下例子,就是通过Properties流来读取配置 

 /**
     * 读取配置文件属性
     * @param path  配置文件路径
     * @return
     * @throws IOException
     */
    public Map readerConfigurationFile(String path) throws IOException {
        /**
         * 使用Properties读取配置文件并获取配置信息
         */
        Properties properties = new Properties();
        InputStream input = new BufferedInputStream(new FileInputStream(path));
        properties.load(input);

        /**
         * 将获取到的配置信息转存到map集合
         */
        Map map = new HashMap();
        for (Object key : properties.keySet()) {
            if (properties.get(key) != null && !properties.get(key).toString().trim().equals("")){
                map.put(key,properties.get(key));
            }
        }
        return map;
    }

 文章来源地址https://www.toymoban.com/news/detail-618272.html

3.通过Spring 自动装配,在项目启动时就把配置信息发送到jar包里面(强烈推荐)

  这个方法虽然前期建立的时候比较繁琐,但是完成之后简直方便到飞起

  首先,建立一下格式的结构,方便我们后面能够快捷找到要编写的文件

关于自定义程序打包成jar包,并读取配置

实际上DemoApplication.java 是可以去掉的,只是个人为了方便测试写的代码,看是否有bug就留下来启动项目用的

 最最最重要的pom.xml文件应该这样写:

<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<!-->--------------------这里是自己jar的情况,自己编写---------  -------<-->
<modelVersion>4.0.0</modelVersion> <groupId>com.transfer</groupId> <artifactId>DataTransferService</artifactId> <version>0.0.1-SNAPSHOT</version> <name>DataTransferService</name> <description>DataTransferService</description> <properties> <spring-boot.version>2.6.13</spring-boot.version> </properties>
<!-->---------------------------------------------------------------<-->
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-jdbc</artifactId> </dependency> <!-- 自动配置 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> </dependency> <!-- 配置属性 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-configuration-processor</artifactId> <optional>true</optional><!-- 依赖不传递 --> </dependency> <!--Lombok依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <scope>provided</scope> </dependency> <!--mysql数据库驱动 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> <scope>runtime</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-dependencies</artifactId> <version>${spring-boot.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>8</source> <target>8</target> </configuration> </plugin> </plugins> </build> </project>

 

  在config包里面,我们要建立几个配置文件:

UserConfiguration.java

@Slf4j
@Configuration
@ConditionalOnExpression("${enabled:true}")
@EnableConfigurationProperties(UserConfiguration .class)
public class UserConfiguration {

    @Bean
    @Primary
    public UserConfig getConfigValue(UserProperties properties){
        if (properties.getLog()){
            log.info("数据库中转服务API组件 ——> 开启组件");
        }
        return new UserConfig()
                .setOtherDataSourcesMap(properties.getOtherDataSourcesMap())
                .setLog(properties.getLog());
    }
}

UserConfig.java

@Data
@Accessors(chain = true)
public class UserConfig implements Serializable {
    private Map<String,Map<String,Map<String,Object>>> otherDataSourcesMap;

    /** 是否打印操作日志 */
    private Boolean log = true;
}
UserProperties.java
@Data
@ConfigurationProperties(prefix = "User")
public class UserProperties implements Serializable {

    private Map<String,Map<String,Map<String,Object>>> otherDataSourcesMap;

    /** 是否开启 */
    boolean enabled = true;

    /** 是否打印操作日志 */
    private Boolean log = false;
}
请注意:这里的@ConfigurationProperties 注解里面的 prefix 参数指的是在配置文件中你自己定义的标识符
UserBeanInject.java
public class UserBeanInject {

    /**
     * 注入配置Bean
     *
     * @param config 配置对象
     */
    @Autowired(required = false)
    public void setConfig(UserConfig config){
        UserSpi.setConfig(config);
    }
}

 当然,还有重要的一步,那就是在resources文件夹下创建一个Spring自动装配的约定文件,使得我们这几个java配置文件能够生效

关于自定义程序打包成jar包,并读取配置

 spring.factories

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  自己定义的包路径.configuration.UserConfiguration, \
  自己定义的包路径.configuration.UserBeanInject

 然后,我们要暴露这个接口

UserSpi.Java
@Slf4j
public class UserSpi{
    public volatile static UserConfig config;

    public static void setConfig(UserConfig config){
        UserSpi.config = config;
        if (config.getLog()){
            log.info("数据库中转服务API组件 ——> 打印配置信息\n", JSONUtil.toJsonStr(UserSpi.config));
        }
    }

    // =================== 获取Api 相关 ===================

    public static IUserService api = new UserServiceImpl();
}

这样基本上完成jar自动装配外部配置文件的配置,业务逻辑什么的看个人习惯自己去编写

 

感言

  • 从数据库里面读取配置信息方便时挺方便的,但是在高并发与高请求的项目中并不适用,而每次调用这个jar的时候通过关键字去读取配置会造成内存资源不断被刷新,容易内存爆炸,个人推荐第3种方式。
  • 还有,每次该改写完代码,一定要重新构建项目,重新编译一下,不然你打出来的Jar包,永远都是你改写之前的代码,改写之后的代码不会写入到Jar包里面!!!!
  • 对了,直接把配置文件里面的值直接传递到jar包里面也是一种方法,但是要是被半路拦截,岂不是直接泄露数据,故不提倡,还有一点,就是代码的可维护性会变得很低

到了这里,关于关于自定义程序打包成jar包,并读取配置的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Docker 将jar包 打包成容器,并挂载jar包和指定yml配置

    1.在 Dockerfile 中指定基础镜像,如 openjdk:8-jdk-alpine。 2.在 Dockerfile 中创建一个工作目录,如 /app。 3.将 jar 包复制到工作目录中,可以使用 COPY 指令。 4.将 yml 配置文件复制到工作目录中,也可以使用 COPY 指令。 5.暴露 jar 包使用的端口,可以使用 EXPOSE 指令。 6.在 Dockerfile 中指

    2024年02月05日
    浏览(50)
  • 使用IDEA把Java程序打包成jar

    点击左上角File,选择Project Structure 左侧选中Artifacts,点击右侧的+号   选择JAR-From modules with dependencies 选择你要运行的main方法所在的类,选好了点击OK  Artifacts添加完成后点击右下角OK  在工具栏中找到Build,选择Build Artifacts   刚才创建好的Artifacts,选择Build   在项目的 outartifac

    2024年02月11日
    浏览(34)
  • IDEA打包jar包,以及exe应用程序。

    一、将IDEA中的java项目打包成jar包 ①点击菜单栏中的文件→项目结构 ②在项目结构窗口选择工件。点击添加,选择jar,选择来自有依赖项的模块 ③在【从模块创建JAR】对话框中,选择主类,点击确定 ④点击确定。 ⑤点击菜单栏中的构建,选择构建项目 ⑥点击菜单栏中的构

    2024年02月08日
    浏览(68)
  • 关于jar包的命令:运行jar包时指定端口、直接修改jar包里的配置文件

    如下:指定端口为8081,不管jar包里面之前是指定了什么端口号,最终访问服务时还是以8081这个端口进行访问 vim进入jar包后,会有类似如下的的内容 在定位到具体某行(文件名)后,该文件会有提示,直接回车进入编辑模式,即可编辑了

    2024年02月12日
    浏览(52)
  • 关于exe4j如何将java jar包打包成windows系统exe可执行文件,并包含JDK环境,超详细教程

    最近做了几个javaFX桌面软件,因为是maven项目,最后打包出来的是jar包,windows系统下要运行jar包,首先要安装JDK环境,然后敲命令:java -jar xxx.jar,才能运行程序,这样会显得很麻烦。而且前提是用户已经安装了JDK环境,所以实用性大大降低。这时就需要把jar包转化成exe可执

    2024年04月28日
    浏览(50)
  • 通过IDEA将java程序或者项目打包为jar包(详细步骤)

    通过IDEA将java程序或者项目打包为jar包 文章目录 目录 文章目录 一、使用java语言,编写一个字典(Dict)Demo 二、将Dict程序打包为jar包 代码如下: 1.点击file,点击project structure. 2.点击Artifacts,点击“+”,点击JAR,点击from......dependencies.  3.选择项目位置Module,和程序类Main Class(要

    2024年02月11日
    浏览(63)
  • 在IDEA上运行成功,打包成jar包后,运行报错,程序自动退出

            java环境不正确,很有可能安装了多个环境,导致程序加载了错误程序。         尝试修改环境变量,如果不行,建议删除掉多余的java环境。          注意:删除掉多余的Java环境需要用程序删除,直接删除文件,容易删不干净。如下图,可以打开程序与功能删除

    2024年01月20日
    浏览(39)
  • 2023年最新IDEA中 Java程序 | Java+Kotlin混合开发的程序如何打包成jar包和exe文件(gradle版本)

    一. JAVA | JAVA和Kotlin混开开发的程序打包成jar方法 1.1 方法一 :IDEA中手动打包 1.2 方法二 :build.gradle中配置后编译时打包 二. JAVA | JAVA和Kotlin混合开发的程序打包成exe的方法 纯JAVA | 纯Kotlin | JAVA和Kotlin混合开发打包其实都一样的,因为jar包中主要还是class文件,而kotlin在编译后

    2024年02月12日
    浏览(57)
  • 为自定义的JAR应用程序创建一个systemd启动服务

    要为自定义的JAR应用程序创建一个systemd启动服务,请遵循以下步骤: 使用文本编辑器创建一个名为 myapp.service 的新文件: 将以下内容复制并粘贴到新创建的 myapp.service 文件中:          备注:请根据您的系统和应用程序安装进行适当的调整。例如,如果您的JAR文件路径

    2024年02月17日
    浏览(44)
  • iphone拷贝照片中间带E自动去重软件,以及java程序如何打包成jar和exe

    用苹果手机照相,有不使用默认的4:3拍照的习惯。 如果只使用默认4:3比例拍照,后面的内容均可跳过。 我们在将iphone照片拷贝到电脑的过程中(USB接入电脑拷贝的方式),如果喜欢使用16:9来拍照或者出现过不是默认的4:3拍照的情形,你会发现拷贝出来的照片 总是有一模一样

    2024年02月12日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包