刚写的一个自动编译、混淆、打包jar的代码,做个记录

用到的NuGet:

<?xml version="1.0" encoding="utf-8"?>
<packages><package id="DotNetZip" version="1.10.1" targetFramework="net45" /><package id="Newtonsoft.Json" version="10.0.2" targetFramework="net45" />
</packages>

  

using Ionic.Zip;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace ApiCloudModulePackage
{class Program{static string tempPath;static ToolConfig toolConfig;static void Main(string[] args){tempPath = Path.GetTempPath() + Guid.NewGuid().ToString("N") + "\\";if (Directory.Exists(tempPath) == false){Directory.CreateDirectory(tempPath);}toolConfig = Newtonsoft.Json.JsonConvert.DeserializeObject<ToolConfig>( File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "projects.json") );try{foreach (ProjectConfig project in toolConfig.projects){//compile jarjarProject(project);}Console.Write("需要现在生成模块的zip文件吗?[y/n]:");while(true){var keyResult = Console.ReadKey();if (keyResult.Key == ConsoleKey.Y){ Console.WriteLine("\r\n");//make zip file from module folderforeach (var moduleFolder in toolConfig.modules){makeZip(getPathFromConfig(moduleFolder));Console.WriteLine("打包输出:" + moduleFolder + ".zip");}break;}else if (keyResult.Key == ConsoleKey.N){Process.GetCurrentProcess().Kill();}}Console.WriteLine("打包完成!  按任意键退出");}catch(Exception ex){Console.WriteLine(ex.Message);}try{Directory.Delete(tempPath, true);}catch{}Console.ReadKey();}static void makeZip(string folder){string zipfilepath = Path.GetDirectoryName(folder) + "\\" + Path.GetFileName(folder) + ".zip";if (File.Exists(zipfilepath))File.Delete(zipfilepath);using (ZipFile zip = new ZipFile(zipfilepath)){string root = Path.GetFileName(folder);zip.AddDirectoryByName(root);zip.AddDirectory(folder , root);zip.Save();}}static void jarProject(ProjectConfig project){Console.WriteLine("正在编译" + project.sourceFolder);string srcPath = getPathFromConfig(project.sourceFolder);//create temp folderstring tempFolder = tempPath + Guid.NewGuid().ToString("N") + "\\";string classTempFolder = tempFolder + Guid.NewGuid().ToString("N") + "\\";string jarDstFolder = tempFolder + "jar\\";string proguardFolder = tempFolder + "jar\\";if (Directory.Exists(jarDstFolder) == false){Directory.CreateDirectory(jarDstFolder);}if (Directory.Exists(classTempFolder) == false){Directory.CreateDirectory(classTempFolder);}List<string> javaFiles = new List<string>();getFiles(javaFiles, srcPath , "*.java");//copy java files to temp folderstring encoding = null;foreach( string javafile in javaFiles ){if(encoding == null){var encode = GetFileEncodeType(javafile);if(encode == System.Text.Encoding.UTF8){encoding = "utf-8";}else{encoding = "GBK";}}File.Copy(javafile, tempFolder + Path.GetFileName(javafile) , true);}StringBuilder libJars = new StringBuilder();StringBuilder proguardJars = new StringBuilder();if (!string.IsNullOrEmpty(project.libPath)){List<string> jarList = new List<string>();Program.getFiles(jarList, Program.getPathFromConfig(project.libPath), "*.jar");if (jarList.Count > 0){libJars.Append(" -cp ");foreach (string jarfile in jarList){libJars.Append('"');libJars.Append(jarfile);libJars.Append('"');libJars.Append(';');proguardJars.Append(" -libraryjars ");proguardJars.Append('"');proguardJars.Append(jarfile);proguardJars.Append('"');}}}ProcessStartInfo proStartInfo = new ProcessStartInfo("javac");// -source 1.6 -target 1.6 表示按照jdk1.6标准编译,默认是1.8,太高了,eclipse使用时会出错,因为eclipse项目里面设置的是1.6proStartInfo.Arguments = $"-Xlint:unchecked -Xlint:deprecation -source 1.6 -target 1.6 -encoding {encoding} -bootclasspath {AppDomain.CurrentDomain.BaseDirectory}android.jar {libJars} -d {classTempFolder} {tempFolder}*.java";proStartInfo.UseShellExecute = false;Process process = Process.Start(proStartInfo);process.WaitForExit();if(true){//build jar, jar file actually is zip fileusing (ZipFile zip = new ZipFile($"{jarDstFolder}result.jar")){zip.AddDirectory(classTempFolder);var content = @"Manifest-Version: 1.0
Created-By: 1.8.0_40 (Oracle Corporation)";byte[] bs = System.Text.Encoding.UTF8.GetBytes(content);zip.AddEntry("META-INF/MANIFEST.MF", bs);zip.Save();}}else{这里是利用jar程序生成jar文件//List<string> classFiles = new List<string>();//getFiles(classFiles, tempFolder, "*.class");//foreach (string classfile in classFiles)//{//    File.Copy(classfile, jarDstFolder + Path.GetFileName(classfile), true);//}//proStartInfo = new ProcessStartInfo("jar");//proStartInfo.Arguments = $"cvf {jarDstFolder}result.jar {jarDstFolder}*.class";//proStartInfo.UseShellExecute = false;//process = Process.Start(proStartInfo);//process.WaitForExit();}if(!string.IsNullOrEmpty(project.proguardConfigFile)){Console.WriteLine("正在混淆代码...");process = Process.Start(new ProcessStartInfo("java"){Arguments = $"-jar proguard.jar @{project.proguardConfigFile} -injars {proguardFolder}result.jar -outjars {proguardFolder}result2.jar -libraryjars android.jar {proguardJars}",UseShellExecute = false});process.WaitForExit();if (!File.Exists(string.Format("{0}result2.jar", proguardFolder))){throw new Exception(project.sourceFolder + "代码混淆出错");}File.Delete( $"{proguardFolder}result.jar");File.Move($"{proguardFolder}result2.jar", $"{proguardFolder}result.jar");}if (File.Exists($"{jarDstFolder}result.jar") == false)throw new Exception("编译"+ project.sourceFolder +"失败!");//copy jar to destinationforeach ( var dstpath in project.buildDestinations ){string destination = getPathFromConfig(dstpath);File.Copy($"{jarDstFolder}result.jar", destination, true);Console.WriteLine($"Maked {destination}");}}static System.Text.Encoding GetFileEncodeType(string filename){using (System.IO.FileStream fs = new System.IO.FileStream(filename, System.IO.FileMode.Open, System.IO.FileAccess.Read)){System.IO.BinaryReader br = new System.IO.BinaryReader(fs);Byte[] buffer = br.ReadBytes(2);if (buffer[0] >= 0xEF){if (buffer[0] == 0xEF && buffer[1] == 0xBB){return System.Text.Encoding.UTF8;}else if (buffer[0] == 0xFE && buffer[1] == 0xFF){return System.Text.Encoding.BigEndianUnicode;}else if (buffer[0] == 0xFF && buffer[1] == 0xFE){return System.Text.Encoding.Unicode;}else{return System.Text.Encoding.Default;}}else{return System.Text.Encoding.Default;}}}static string getPathFromConfig(string path){if (path[1] == ':')return path.Replace("/", "\\");else{return AppDomain.CurrentDomain.BaseDirectory + path.Replace("/", "\\");}}static void getFiles(List<string> result, string folder , string pattern){var files = Directory.GetFiles(folder, pattern);result.AddRange(files);var dirs = Directory.GetDirectories(folder);foreach( var dir in dirs ){getFiles(result, dir , pattern);}}}
}

  

转载于:https://www.cnblogs.com/IWings/p/6652828.html

贴一段自动编译java,并混淆编译的代码相关推荐

  1. java如何编译和反编译,JAVA 如何反编译的自己的程序

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 JAVA 如何反编译的自己的程序 反编译的工具有好多, 在众多的JAVA反编译工具中,有几种非常著名的工具使用了相同的核心引擎--JAD,其中主要包括:F ...

  2. java预编译啥意思_java预编译 java jdbc 预编译语句和普通语句的区别

    java中什么是预编译precompile?总有一天你恍然大悟,父母是你花心思,花时间最少,却最爱你的人. 什么是预编译?起什么作用的? . 在java中如何实现预编译?祝你幸福!这句话真俗.小编会祝 ...

  3. notepad编译java文件_notepad编译java

    用myeclipse,eclipse等相关编译软件的时候,优点自然不用多说.但是不如notepad的小巧,占用资源少,启动迅速的特点,接下来讲述怎样在notepad中编译java 本篇内容所描述的只是 ...

  4. doc无法编译java文件_java编译成jar文件.doc

    java编译成jar文件 Java程序打包成jar包 (2012-06-08 10:28:23) 转载▼ 标签: 分类: 方法一:通过jar命令 jar命令的用法: 下面是jar命令的帮助说明: 用法 ...

  5. Java打包混淆之Allatori

    1.前言 熟悉Java的人都知道Java代码编译成class文件就可以部署运行了,但是class文件通过jdk-gui等工具是很容易反编译就看到源代码的,在代码给到客户私有化部署时,为了保护咱们自己的 ...

  6. 编译Java程序一共要安装什么_如何编译java程序

    如何编译java程序 java编程要如何编译java程序?编译java程序要注意什么?代码是什么?下面跟yjbys一起来学习一下. 要安装好jdk,设置好相应的环境变量,然后在命令行里面javac. ...

  7. 总结python源文件编译、反编译、加密混淆

    本文更新地址 一.编译 1. 编译为 pyc 2. 编译为 pyo 或者 opt-n.pyc 文件 3. 编译成 pyd 或 so 链接库 编译方法一 编译方法二 编译方法三 使用建议 二.打包 1. ...

  8. jenkins编译java_在Window上使用Jenkins自动发布Java工件

    jenkins编译java 这篇文章将展示如何使用Jenkins Continuous Integration自动执行Java Web应用程序(使用MYSQL DB和基于Hibernate ORM在基 ...

  9. ant混淆编译java web,Android中使用ant混淆编译

    搞了好几天,查看了上百个网站,最后摸索出一套很简单的ant混淆编译的方法.下面开始: 1.拿一个普通项目来说,首先为它加上ant编译功能. android update project --name ...

  10. Jenkins+Gitlab+Nginx+Maven编译Java项目自动发布与基于tag版本回退(重复构建问题已解决)

    实现流程: 手动部署Java项目至后端Web集群 1.搭建Nginx+Tomcat集群架构. 2.开发提交Java源代码至Gitlab仓库. 3.手动获取Java源代码,然后使用Maven进行编译. ...

最新文章

  1. golang 中 map 转 struct
  2. 聚合(根)、实体、值对象精炼思考总结
  3. spring aop execution表达式
  4. 操作系统与存储:解析Linux内核全新异步IO引擎io_uring设计与实现
  5. 【算法设计与分析】10 差消法化简高阶递推方程
  6. 泰安第一中学2021年高考成绩查询,等级考第一天结束 泰安部分考生已完成2021年高考...
  7. 当前超级计算机的应用方兴未艾,四川省若尔盖县高三下学期语文模拟卷(五)
  8. c++椭圆最小二乘法原理_c++ 椭圆拟合之最小二乘法(图像处理)
  9. 无源波分和彩光模块_纯无源粗波分复用器(CWDM)部署4/5G网络,节省光缆资源...
  10. c++ 将引用赋值给引用_5分钟掌握 Python 对象的引用
  11. source insight 4 破解
  12. redis用zset做延时消息
  13. 给项目添加spring的测试单元
  14. 用户金字塔模型的应用:知乎案例分析
  15. 如何把PDF转换成word呢?
  16. ​《2020科技趋势报告》重磅发布,AI 和中国,成为未来科技世界关键词
  17. suse linux zypper iso,SUSE Linux的zypper命令详解
  18. mysql设计收藏与标签
  19. sql计算上班总时长——以每天的第一次上下班打卡时间为准
  20. 《微信小程序七日谈》- 第七天:不要捡了芝麻丢了西瓜

热门文章

  1. oracle分页包,Oracle分页获取数据的实现 (包和存储过程)
  2. java执行python脚本_使用Runtime.getRuntime().exec()在java中调用python脚本
  3. java查题小程序_求助大神来写一个java的小程序,题目如下
  4. 多个cpp文件生成so_C++:C++的文件搜索路径
  5. pycharm ubuntu 安装_Nvidia Jetson Xavier 安装配置(ubuntu 18.04)
  6. 2017菜鸡C与C++工程师总结,撸码撸码,垃圾专科生撸码人生
  7. php拼接多个insert,php – 将多个INSERTS分成一个表和多个表
  8. Sublime Text3常用基本操作
  9. 【渝粤教育】国家开放大学2019年春季 4有机合成单元反应 参考试题
  10. 【渝粤题库】陕西师范大学163201 旅游科学引论作业(专升本)