Unity一键打包经常会出现Jar冲突的情况,人工去查蛋都会碎掉。。。
首先是Java控制台代码。
package com.sinyee.babybus;
import java.io.*;
import java.util.*;
import java.util.zip.*;
public class JarExporter
{
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException
{
List<String> messages = getConflictMessages(args);
for (String string : messages)
{
System.err.println(string);
}
}
public static List<String> getClassNamesFromJar(String path) throws IOException
{
List<String> classNames = new ArrayList<String>();
ZipInputStream zip = new ZipInputStream(new FileInputStream(path));
for (ZipEntry entry = zip.getNextEntry(); entry != null; entry = zip.getNextEntry())
{
if (!entry.isDirectory() && entry.getName().endsWith(".class"))
{
String className = entry.getName().replace('/', '.');
classNames.add(className.substring(0, className.length() - ".class".length()));
}
}
zip.close();
return classNames;
}
public static List<String> getConflictMessages(String... jars)
{
List<String> messages = new ArrayList<String>();
if(jars == null || jars.length < 2)
return messages;
HashMap<String, String> hashMap = new HashMap<String, String>();
for (String jar : jars)
{
try
{
List<String> classNames = getClassNamesFromJar(jar);
for (String name : classNames)
{
if(hashMap.containsKey(name))
{
messages.add(name + " " + jar + " " + hashMap.get(name));
break;
}
hashMap.put(name, jar);
}
}
catch (IOException e)
{
e.printStackTrace();
}
}
return messages;
}
}
导出Jar的时候记得选择Main Class。

最后是C#代码。
public static void GetConflictMessages(params string[] jars)
{
if (jars == null || jars.Length < 2)
return;
var jarArguments = "";
foreach (var jar in jars)
jarArguments += " \"" + jar + "\"";
var processStartInfo = new System.Diagnostics.ProcessStartInfo();
processStartInfo.FileName = "java";
processStartInfo.Arguments = "-jar \"" + Application.dataPath + "/BabyFrameWork/AndroidBuilder/Tools/JarExporter.jar\"" + jarArguments;
processStartInfo.RedirectStandardOutput = true;
processStartInfo.RedirectStandardError = true;
processStartInfo.UseShellExecute = false;
var process = System.Diagnostics.Process.Start(processStartInfo);
process.WaitForExit();
var standardOutput = process.StandardOutput.ReadToEnd();
if (standardOutput != "")
Debug.Log(standardOutput);
var standardError = process.StandardError.ReadToEnd();
if (standardError != "")
Debug.LogError(standardError);
}
网友评论