GVKun编程网logo

关于web工程实现动态编译代码,出现找不到第三方jar包的解决方案。

16

关于关于web工程实现动态编译代码,出现找不到第三方jar包的解决方案。的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android源码中mmm依赖第三方jar包的项目、android工

关于关于web工程实现动态编译代码,出现找不到第三方jar包的解决方案。的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于android 源码中mmm依赖第三方jar包的项目、android工程生成第三方jar包、c# 动态编译代码、eclipse下将maven项目打包为jar(1.不带第三方jar,2.带第三方jar)等相关知识的信息别忘了在本站进行查找喔。

本文目录一览:

关于web工程实现动态编译代码,出现找不到第三方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 源码中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包

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# 动态编译代码

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)

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)的相关信息,请在本站寻找。

本文标签: