将Java项目打包为可执行文件

本实例的Java工程构建了一个简单的服务器,监听本地的12345端口,当接收到GET请求:/get_cpuid时,返回当前运行终端的CPUID信息 整个流程分为两部分: 工程打包为jar文件 jar文件转换为exe安装程序,安装后得到exe可执行程序 在打包为jar之前需要指定主类,Maven设置: <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> <configuration> <transformers> <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer"> <mainClass>org.example.LocalHardwareService</mainClass> </transformer> </transformers> </configuration> </execution> </executions> </plugin> </plugins> </build> 执行mvn package后会打包为一个fat jar,文件名GetDeviceInfo-1.0-SNAPSHOT-shaded.jar 警告 若不使用fat jar,则安装的exe会提示启动JVM失败 执行以下jpackage命令: jpackage --input target/ --name LocalHWService --main-jar GetDeviceInfo-1.0-SNAPSHOT-shaded.jar --main-class org.example.LocalHardwareService --type exe --vendor "FICN" --description "Local Hardware Info Service" input:输入目录。因为jar文件是被打包存储于项目的/target目录中的; main-jar:jar文件名; main-class:主类名; vendor:发行公司名; description:文件描述,会显示在任务管理器中 说明 一般来说,vendor和description属性是无需特别指定的,但由于执行这jpackage指令会使用WiX,而我所安装的WiX(v3.14.1)的这两个属性默认会使用非ASCII字符,这就导致了jpackage命令报错,所以需要手动指定这两个属性,保证是纯英文 命令完成后在当前目录生成LocalHWService-1.0.exe文件,这个文件并不能直接运行服务,而是一个安装程序 双击打开后自动安装,一般会安装到C:\Program Files中,进入子目录\LocalHWService后,可以看到文件: LocalHWService.exe就是服务文件了,双击运行,打开任务管理器可以看到其在后台正常运行: 在浏览器中进行测试,此时请求正常得到响应:

August 5, 2025

Stream流遍历处理字符串中各字符

Stream在数组处理上的特点 首先明确一点: char[] chs = {'h','e','l','l','o'}; int[] ints = {1,2,3,4}; String str = "hello"; String[] strs = {"hello","world"}; //数组的Stream流泛型都是数组,而不是数组中的单个元素 Stream<char[]> chsStream = Stream.of(chs); Stream<int[]> intsStream = Stream.of(ints); //String的Stream流泛型都是String Stream<String> strStream = Stream.of(str); Stream<String> strsStream = Stream.of(strs); //在这种情况下,流中的每个元素都是String[]数组中的单个元素 如果我们的目的是处理数组中的每一个元素,那么对于Stream<T[]>这种类型的流我们一般是并不想见到的 解决方法就是使用基本类型流,即IntStream、DoubleStream和LongStream,然后再操作(或对基本类型流先进行boxed()转为Stream<T>再操作),而得到基本类型流的方法有两种: Arrays.stream() 基本类型流名.of() Stream处理字符串 - 以凯撒密码为例 若要对字符串中的每个字符进行逐个操作,最容易想到,也最快的方法就是先使用toCharArray()将字符串转为一个char[]数组,再使用循环进行操作,最后使用String的构造方法将之再转换回字符串: //正常方法 char[] chars = str.toCharArray(); for(int i=0;i< chars.length;i++) { chars[i] = (char)((chars[i]-'a'+k)%26+'a'); } System.out.println(new String(chars)); 这次我舍近求远,想用Stream流来模拟生成凯撒密码密文的操作 根据Stream处理数组的特点,String转换成char[]之后,要想对数组的每个元素都进行操作,就要使用基本类型流,但并没有char类型的基本类型流,在这就导致我只能得到Stream<char[]>,而得不到如CharStream或是Stream<Character>的流 所以,不能将String转为char[]数组 那么,借助String[]数组的流中可以遍历到数组中的每个元素的特点,考虑将String转为String[]数组,再使用map()将每个元素转换成char,这样才得到一个Stream<Character>: Stream<String> t = Stream.of(str.split("")); //str:{"h","e","l","l","o"} Stream<Character> chStream = t.map(s -> s.charAt(0)); chStream = t.map(ch -> (char)((ch-'a'+1)%26+'a'); /* * 也可直接一步完成操作: * s -> (char)((s.charAt(0)-'a'+1)%26+'a') */ 得到了Stream<Character>以后,才能正式地开始遍历每个字符并处理。处理结束后,将Stream<Character>重新拼接成字符串即可 ...

September 6, 2022

Stream流进行数组排序

考虑一个数组: int[] nums = {9,6,5,7,4,8,3,1,2}; 对于数组,列举几个转换Stream流的操作及返回值: //返回Stream对象,但泛型为int[]数组 Stream<int[]> nums1 = Stream.of(nums); //返回一个IntStream对象,默认无泛型 IntStream nums2 = IntStream.of(nums); IntStream nums3 = Arrays.stream(nums); 若想要对数组进行排序,则使用sorted()方法,但需要注意的是,IntStream的sorted无入参,即只能自然排序,只有Stream中的sorted才能指定比较器,所以将之转化为Stream类型,再进行排序: //使用boxed()将IntStream转换为Stream类型,即将IntStream中的每个整型都进行装箱 //nums2同理 Stream<Integer> boxedNums = nums3.boxed(); //进行排序 Stream<Integer> sortedNums = boxedNums.sorted((o1,o2) -> o2-o1); 排序完成后,仍是一个Stream对象。若想将之转换回数组,则使用toArray()方法 但仍然需要注意,在Stream中,由于Stream的泛用性,toArray()返回的是Object类型的数组,而非int类型,所以,需要首先转化为IntStream,表示其中存储的都是整型数据,然后使用该对象中的toArray()方法: //使用mapToInt转化为IntStream对象 //此处的intValue是将原本的Integer包装类转换为int基本类 IntStream temp = sortedNums.mapToInt(Integer::intValue); //最终转换为数组 int[] res = temp.toArray(); 以下总结前文提到的Stream和IntStream的同名方法及必要说明,方便判断是否需要进行对象类型的转换: Stream: Stream<T> of(T t):返回一个Stream对象,其泛型是参数泛型 Stream sorted():可带参可不带参 Object[] toArray():返回一个Obj的数组 IntStream: IntStream of(int… values):返回一个IntStream对象,直接存有数组每个元素 IntStream sorted():只有无参的 int[] toArray():返回一个int的数组 此外,Arrays.stream()也能返回一个IntStream对象,效果与IntStream.of()一致,且其针对数据数组有更多重载,泛用性更强

September 5, 2022