关于关于web工程实现动态编译代码,出现找不到第三方jar包的解决方案。的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android源码中mmm依赖第三方jar包的项目、android工
关于关于web工程实现动态编译代码,出现找不到第三方jar包的解决方案。的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android 源码中mmm依赖第三方jar包的项目、android工程生成第三方jar包、c# 动态编译代码、eclipse下将maven项目打包为jar(1.不带第三方jar,2.带第三方jar)等相关知识的信息别忘了在本站进行查找喔。
本文目录一览:- 关于web工程实现动态编译代码,出现找不到第三方jar包的解决方案。
- android 源码中mmm依赖第三方jar包的项目
- android工程生成第三方jar包
- c# 动态编译代码
- eclipse下将maven项目打包为jar(1.不带第三方jar,2.带第三方jar)
关于web工程实现动态编译代码,出现找不到第三方jar包的解决方案。
出现的问题:
我用spring boot搭建一个web环境,想实现动态加载一个外部的java文件,编译并运行得到结果。
大概代码如下:
/** * * <p>Title: compile</p> * <p>Description: compile </p> * @param javaName javaName the name of your public class,eg: <code>TestClass.java</code> * @param javaSrc source code string * @return return the Map, the KEY means ClassName, the VALUE means bytecode. */ public static Map<String, byte[]> compile(String javaName, String javaSrc) { // 获取jvm的jre JavaCompiler compiler = ToolProvider.getSystemJavaCompiler(); StandardJavaFileManager stdManager = compiler.getStandardFileManager(null, null, null); try (MemoryJavaFileManager manager = new MemoryJavaFileManager(stdManager)) { JavaFileObject javaFileObject = manager.makeStringSource(javaName, javaSrc); // 用来获取编译错误时的错误信息 DiagnosticCollector<JavaFileObject> collector = new DiagnosticCollector<>(); JavaCompiler.CompilationTask task = compiler.getTask(null, manager, collector, null, null, Arrays.asList(javaFileObject)); if (task.call()) { return manager.getClassBytes(); } else { // 当编译存在错误的时候,打印错误日志 collector.getDiagnostics().forEach(item -> log.error(item.toString())); } // 关闭StandardJavaFileManager stdManager.close(); } catch (IOException e) { log.error("出现异常 : " , e); } return null; }
但是,我外部的java文件是含有第三方jar包的(这些jar包,我的spring boot工程全部含有)。
在eclipse下运行时,一切顺利,但当我将spring boot打包成jar包,使用java -jar 的方式运行的时候,这段代码在编译java文件时出错,提示
error: package org.jsoup does not exist import org.jsoup.Jsoup;
解决方法:
1. 不能使用jar包部署(楼主找了很久都没找到jar包这么解决,所以放弃了,有知道的大佬帮忙补充一下。)
本例子使用war包的方式部署到tomcat上。
2. 修改以上代码,编译时加入编译属性:
/**
*
* <p>Title: compile</p>
* <p>Description: compile </p>
* @param javaName javaName the name of your public class,eg: <code>TestClass.java</code>
* @param javaSrc source code string
* @return return the Map, the KEY means ClassName, the VALUE means bytecode.
*/
public static Map<String, byte[]> compile(String javaName, String javaSrc) {
// 获取jvm的jre
JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
StandardJavaFileManager stdManager = compiler.getStandardFileManager(null, null, null);
try (MemoryJavaFileManager manager = new MemoryJavaFileManager(stdManager)) {
JavaFileObject javaFileObject = manager.makeStringSource(javaName, javaSrc);
// 用来获取编译错误时的错误信息
DiagnosticCollector<JavaFileObject> collector = new DiagnosticCollector<>();
/** START 以下代码在打包成web程序时必须开启,在编辑器里面时请屏蔽 */
StringBuilder cp = new StringBuilder();
URLClassLoader urlClassLoader = (URLClassLoader) Thread.currentThread().getContextClassLoader();
for (URL url : urlClassLoader.getURLs()) {
cp.append(url.getFile()).append(File.pathSeparator);
}
List<String> options = new ArrayList<String>();
options.add("-classpath");
options.add(cp.toString());
/** END 以上代码在打包成web程序时必须开启,在编辑器里面时请屏蔽 */
// 此处的options 只有打包成web服务时,才需要,在编辑器中运行时,直接填null即可。
JavaCompiler.CompilationTask task = compiler.getTask(null, manager, collector, options, null,
Arrays.asList(javaFileObject));
if (task.call()) {
return manager.getClassBytes();
} else {
// 当编译存在错误的时候,打印错误日志
collector.getDiagnostics().forEach(item -> log.error(item.toString()));
}
// 关闭StandardJavaFileManager
stdManager.close();
} catch (IOException e) {
log.error("出现异常 : " , e);
}
return null;
}
3. 请注意,在编辑器中运行时,加入 options 会导致运行失败,所以在编辑器中请屏蔽掉,发布时再打开。
android 源码中mmm依赖第三方jar包的项目
目前做android项目经常碰到,eclipse中建立项目,依赖第三方jar包,编译通过;然后放到android源码里去编译,就提示找不多第三方jar包,为此还经常搞得头疼不已。经过网上不断search,终于找到一个行之有效的方法:
在项目根目录下的Android.mk中:
1.
LOCAL_STATIC_JAVA_LIBRARIES := libGoogleAnalytics libGoogleAdMobAdsSdk libmobclix
2.
##################################################
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libGoogleAnalytics:libs/libGoogleAnalytics.jar
include $(BUILD_MULTI_PREBUILT)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libGoogleAdMobAdsSdk:libs/GoogleAdMobAdsSdk-4.1.1.jar
include $(BUILD_MULTI_PREBUILT)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libmobclix:libs/mobclix.jar
include $(BUILD_MULTI_PREBUILT)
把依赖的jar包放到libs目录下,先预编译到out/target/product/generic/obj/JAVA_LIBRARIES下,然后本项目就会找到依赖的者jar包了。下面完整Andraoid.mk如下:
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_MODULE_TAGS := optional
# Only compile source java files in this apk.
LOCAL_SRC_FILES := $(call all-java-files-under, src)
LOCAL_PACKAGE_NAME := DependJarTest
LOCAL_CERTIFICATE := platform
LOCAL_STATIC_JAVA_LIBRARIES := libGoogleAnalytics libGoogleAdMobAdsSdk libmobclix
include $(BUILD_PACKAGE)
##################################################
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libGoogleAnalytics:libs/libGoogleAnalytics.jar
include $(BUILD_MULTI_PREBUILT)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libGoogleAdMobAdsSdk:libs/GoogleAdMobAdsSdk-4.1.1.jar
include $(BUILD_MULTI_PREBUILT)
include $(CLEAR_VARS)
LOCAL_PREBUILT_STATIC_JAVA_LIBRARIES := libmobclix:libs/mobclix.jar
include $(BUILD_MULTI_PREBUILT)
# Use the folloing include to make our test apk.
include $(call all-makefiles-under,$(LOCAL_PATH))
android工程生成第三方jar包
总结一下:资源文件是无法打进jar包的,打进去也没有用,所以下面的方式是jar包和资源文件都需要调用工程添加的。如果想把资源打进包内可以使用Is Library方式,但是这样会暴露源码,当然也有解决方案:http://www.cnblogs.com/wangchuanju/archive/2012/04/05/android_lib_jar.html
由于项目原因,我选择了普通的jar方式。
开发中需要将一个已存在的工程生成一个jar包供新的app来使用。
大概流程如下。生成jar包的应用称为A ,
右键A app 弹出菜单,选中Export...如图
![]()
在弹出的页面选择Java/ JAR file 点击“next” 如图
![]()
在弹出的界面 左方去掉res的勾选,不用将res导出到jar包内,我们后期可以直接将res内的布局,以及图片资源放到
新的app内的res对应的文件夹下(前提是不要重名)。 在右方,的几个一些属性,配置文件都不需要勾选。
下方的JAR file是选择jar包的存放路径以及jar包的名称。一直点击next即可。生成jar包。
![]()
至于导入jar包,还是右键工程,选择“build path”------> "Configure Build Path..."
---->Libraries------->Add JARs----------->选择具体的工程------>lib--------->选择jar包即可。
c# 动态编译代码
有时候做计算一些东西时候,算法一直变更,写在程序需要一直调整,因此算法写在 cs 文件,然后动态调用内部的方法去计算判断,只需变更 cs 文件即可。
using Microsoft.CSharp;
using System;
using System.CodeDom.Compiler;
using System.Diagnostics;
using System.IO;
using System.Reflection;
namespace ConsoleApplication
{
class Program
{
static void Main()
{
Stopwatch watch = new Stopwatch();
watch.Start();
// 创建一个 CSharp 语言 Provider
//CodeDomProvider provider = CodeDomProvider.CreateProvider("CSharp");
CSharpCodeProvider provider = new CSharpCodeProvider();
watch.Stop();
Console.WriteLine ("创建耗时:" + watch.ElapsedMilliseconds);
watch.Restart();
// 设置编译时参数
CompilerParameters objCompilerParameters = new CompilerParameters();
// 添加代码用到的相关引用
objCompilerParameters.ReferencedAssemblies.Add("System.dll");
// 没有 Main 函数就不能生成可执行文件
objCompilerParameters.GenerateExecutable = false;
objCompilerParameters.GenerateInMemory = true;
watch.Stop();
Console.WriteLine ("设置编译参数耗时:" + watch.ElapsedMilliseconds);
watch.Restart();
// 编译代码
string code = File.ReadAllText(AppDomain.CurrentDomain.BaseDirectory + "Class1.cs");
CompilerResults cr = provider.CompileAssemblyFromSource(objCompilerParameters, code);
watch.Stop();
Console.WriteLine ("编译耗时:" + watch.ElapsedMilliseconds);
if (cr.Errors.HasErrors)
{
Console.WriteLine ("编译错误:");
foreach (CompilerError err in cr.Errors)
{
Console.WriteLine(err.ErrorText);
}
}
else
{
watch.Restart();
// 通过反射,调用 HelloWorld 的实例
object objHelloWorld = cr.CompiledAssembly.CreateInstance("ConsoleApplication.Class1");
MethodInfo objMI = objHelloWorld.GetType().GetMethod("test");
Console.WriteLine(objMI.Invoke(objHelloWorld, null));
watch.Stop();
Console.WriteLine ("调用耗时:" + watch.ElapsedMilliseconds);
}
Console.ReadLine();
}
}
}
被调用的 cs 文件内容
using System;
using System.Collections.Generic;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication
{
class Class1
{
// 写个方法测试下动态调用的情况
public void test()
{
DateTime now = DateTime.Now;
List<string> aa = new List<string>();
aa.Add("aa");
Console.WriteLine(now);
}
}
}
参考地址:http://www.cnblogs.com/jailu/archive/2007/07/22/827058.html
eclipse下将maven项目打包为jar(1.不带第三方jar,2.带第三方jar)
由于项目需要讲maven项目打包为jar包,由于之前没类似经验,百度找例子走了不少弯路,这边随手记录下,网上说的
开发工具:eclipse
jar包管理:maven
一般打包出来的jar包分为两种
一类是没用引用第三方jar包的,他是不能不能直接用的,需要把你打的jar包内引用的第三方jar包引用一下,如果没用maven工具就需要拉在WEB-INF/lib目录下,用了maven的在pom.xml内配置即可,
二类是引用了第三jar包的,这边可以直接使用,单独就可以运行,不需要再去依赖其他jar,但是这样打包的jar基本都是以M为单位
首先保证你的jdk版本和部署的版本是一致的,不然到时候打包出来的jar,不能使用,
其实操作起来很简单,吧以下代码复制去pom.xml里(打包默认是整个项目打包)
<build>
<finalName>blscf-api-uat</finalName>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
</plugin>
</plugins>
</build>
其次从Run As / Maven Build / Main / Goals 处 复制assembly:assembly 过去
最后Run As / Maven install 会自动将程序打包
这样就是OK了,下面是存放位置
后缀带有with-dependencies的为带有第三方jar,没带后缀的就没带。就这么简单,不过只针对maven管理的才是这样操作,如果没用maven也没有第三方jar包,可以直接用工具的导出,导出为jar保存就可以。
关于关于web工程实现动态编译代码,出现找不到第三方jar包的解决方案。的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于android 源码中mmm依赖第三方jar包的项目、android工程生成第三方jar包、c# 动态编译代码、eclipse下将maven项目打包为jar(1.不带第三方jar,2.带第三方jar)的相关信息,请在本站寻找。
本文标签: