- 浏览: 3503302 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
wanglf1207:
EJB的确是个不错的产品,只是因为用起来有点门槛,招来太多人吐 ...
weblogic-ejb-jar.xml的元素解析 -
qwfys200:
总结的不错。
Spring Web Flow 2.0 入门 -
u011577913:
u011577913 写道也能给我发一份翻译文档? 邮件437 ...
Hazelcast 参考文档-4 -
u011577913:
也能给我发一份翻译文档?
Hazelcast 参考文档-4 -
songzj001:
DbUnit入门实战
import java.io.File;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.StringTokenizer;
import java.util.Vector;
/**
* Class to handle CLASSPATH construction
*/
public class Classpath {
Vector _elements = new Vector();
public Classpath() {}
public Classpath(String initial) {
addClasspath(initial);
}
public boolean addComponent(String component) {
if ((component != null) && (component.length() > 0)) {
try {
File f = new File(component);
if (f.exists()) {
File key = f.getCanonicalFile();
if (!_elements.contains(key)) {
_elements.add(key);
return true;
}
}
} catch (IOException e) {}
}
return false;
}
public boolean addComponent(File component) {
if (component != null) {
try {
if (component.exists()) {
File key = component.getCanonicalFile();
if (!_elements.contains(key)) {
_elements.add(key);
return true;
}
}
} catch (IOException e) {}
}
return false;
}
public boolean addClasspath(String s) {
boolean added = false;
if (s != null) {
StringTokenizer t = new StringTokenizer(s, File.pathSeparator);
while (t.hasMoreTokens()) {
added |= addComponent(t.nextToken());
}
}
return added;
}
public String toString() {
StringBuffer cp = new StringBuffer(1024);
int cnt = _elements.size();
if (cnt >= 1) {
cp.append(((File) (_elements.elementAt(0))).getPath());
}
for (int i = 1; i < cnt; i++) {
cp.append(File.pathSeparatorChar);
cp.append(((File) (_elements.elementAt(i))).getPath());
}
return cp.toString();
}
public URL[] getUrls() {
int cnt = _elements.size();
URL[] urls = new URL[cnt];
for (int i = 0; i < cnt; i++) {
try {
urls[i] = ((File) (_elements.elementAt(i))).toURL();
} catch (MalformedURLException e) {}
}
return urls;
}
public ClassLoader getClassLoader() {
URL[] urls = getUrls();
ClassLoader parent = Thread.currentThread().getContextClassLoader();
if (parent == null) {
parent = Classpath.class.getClassLoader();
}
if (parent == null) {
parent = ClassLoader.getSystemClassLoader();
}
return new URLClassLoader(urls, parent);
}
}
代码:
private Classpath classPath = new Classpath(System.getProperty("java.class.path"));
System.setProperty("java.class.path", classPath.toString());
ClassLoader classloader = classPath.getClassLoader();
Thread.currentThread().setContextClassLoader(classloader);
通过修改当前环境的ClassLoader来实现。
评论
Made In Zeal 转载请保留原始链接:http://www.zeali.net/entry/337
标签 ( Tags ): classpath , classloader , 源代码
对于Java开发人员(尤其是初学者)来说,因为classpath配置问题所导致的代码编译运行出错相当普遍,经验教训足可以专文叙之。实际上,我们可以通过实现自定义的ClassLoader等方法来尽量避免classpath对于系统环境的依赖。
通过加参数调用 javac,可以在编译时使用自定义的 ClassLoader 来完成类的定位加载:
javac -J-Djava.system.class.loader=my.ClassLoaderImpl theSource.java
自定义 ClassLoader 的方式可以参考这里(基本上来说就是通过继承 findClass(String) 方法来使JVM按照自己期望的规则来加载类)。还处于beta阶段的 Mustang Java SE 6 据说将提供新的工具 javax.tools.JavaCompilerTool 来替代 javac ,这个全新的编译工具应该会给程序员更好的编译体验。
大多数流行的 java IDE 都大大简化了对于 classpath 的配置过程,以至于很多在程序员的开发环境运行良好的代码发布之后才出现各种各样的问题。所以要想让程序包能够顺利的执行于产品环境,我们通常的做法是写一堆的 bat 或 shell 脚本来完成各种运行参数的配置。而这些大段大段的脚本当中,对 classpath 的配置占了相当大的比重。
因此 Heikki Uusitalo 写了一个 BootLoader 类(原始代码似乎有些问题,这里修改了一下):将这个类作为引导程序去根据自定义的规则来加载所有必需的 jar 包等资源,然后再启动真正的 main 方法。把这个 BootLoader 类单独打包成一个 jar 文件,运行的时候只需要运行它即可。当然你可以根据实际情况修改读取的路径、规则等信息。
view plainprint?
1. import java.io.*;
2. import java.net.*;
3. import java.lang.reflect.*;
4.
5. public class BootLoader
6. {
7. public static void main(final String[] args) throws Exception
8. {
9. // check that the lib folder exists
10. File libRoot = new File(LIB_FOLDER);
11. if(!libRoot.exists()) {
12. throw new Exception("No 'lib' folder exists!");
13. }
14. // read all *.jar files in the lib folder to array
15. File[] libs = libRoot.listFiles(new FileFilter()
16. {
17. public boolean accept(File dir)
18. {
19. String name = dir.getName().toLowerCase();
20. return name.endsWith("jar") || name.endsWith("zip");
21. }
22. });
23.
24. URL[] urls = new URL[libs.length];
25. // fill the urls array with URLs to library files found in libRoot
26. for(int i = 0; i < libs.length; i++) {
27. urls[i] = new URL("file",null,libs[i].getAbsolutePath());
28. }
29. // create a new classloader and use it to load our app.
30. classLoader = new URLClassLoader(urls,
31. Thread.currentThread().
32. getContextClassLoader());
33. // get the main method in our application to bring up the app.
34. final Method mtd = classLoader.loadClass(APP_MAIN_CLASS).getMethod("main",
35. new Class[] {String[].class});
36. // Using thread to launch the main 'loop' so that the current Main method
37. // can return while the app is starting
38. new Thread(new Runnable()
39. {
40. public void run()
41. {
42. try {
43. mtd.invoke(null,new Object[] {args});
44. } // forward the args
45. catch(Exception e) {
46. throw new RuntimeException(e);
47. }
48. }
49. },"AppMain").start();
50. // Give the app some time to start before returning from main.
51. // This doesn't delay the starting in any way
52. Thread.sleep(1000);
53. }
54.
55. private static final String LIB_FOLDER = "lib";
56. private static final String APP_MAIN_CLASS = "com.my.application.MyTest";
57. private static ClassLoader classLoader;
58. }
发表评论
-
字符串分割--java中String.split()用法
2013-03-06 14:25 74151在java.lang包中有String.sp ... -
用 HttpServletResponseWrapper 实现 Etag 过滤器
2012-07-09 16:58 3759原文出处:http://blog.chenlb.com/200 ... -
Fitnesse使用
2012-05-05 13:27 23494Fitnesse 的使用 一,介绍 Fitnesse是一种 ... -
Customizing the new FitNesse parser
2012-05-05 13:13 2134FitNesse began its life using ... -
java application中内嵌ActiveX控件
2011-11-14 15:57 5525我这里用的是SWT/JFace开发application,SW ... -
Google Java Developer Tools Downloads
2011-08-09 00:04 2347WindowBuilder Pro原来叫WindowB ... -
Jalita
2011-08-06 00:49 1566Jalita (Java light terminal ada ... -
【转】用Java写字符终端界面
2011-07-29 13:13 2122终端界面GUI开源项目charva。 这个框架让你可以用开发 ... -
[转]mybatis下的分页,支持所有的数据库
2011-07-21 13:21 14841大 家都知道,mybatis的自带分页方法只是逻 ... -
Java framework for text- & console-based forms?
2011-07-21 01:06 1711charva jcurses JNA , ... -
JNA(Java Native Access)学习入门
2011-07-21 01:04 22627Java Native Access 项目 在 ... -
JAVA上加密算法的实现用例
2011-06-25 12:38 4884来源:www.ibm.com ... -
如何将GlassFish作为Windows服务运行
2011-05-18 23:21 2375本文档来自GlassFish官方网站,详细介绍了将 G ... -
JAVA UDP打洞必备知识点---NAT
2011-05-05 12:56 8699一、引言 RFCl631 ... -
Keystore概念,Keytool工具使用
2011-04-28 16:20 2906近来由于项目需要做Single Sign On, 研究了一 ... -
利用Eclipse Profile Plugin监控分析Tomcat性能
2011-04-18 16:14 3703目前新版本的Eclipse在启动应用服务器的时候有一个新的选 ... -
m2eclipse: Eclipse is running in a JRE, but a JDK is required
2011-02-04 23:43 2542Eclipse 安装了Maven插件,启动Eclipse ... -
利用JNative实现Java调用动态库
2010-10-18 00:43 2101由于项目要求,需要用J ... -
RHEL5支持大内存
2010-10-08 16:19 3005安装 RHEL 5 ,硬件为 4G 内存,安装完成 ... -
Windows Server 2003 和 Windows 2000 提供大内存支持
2010-10-08 16:19 1854本文介绍物理地址扩展 ...
相关推荐
有时,你可能需要根据实际情况动态地添加或修改classpath。在Java程序中,可以使用`java.lang.ClassLoader`的子类来实现这一点。例如,使用URLClassLoader可以加载指定路径下的类: ```java URL[] urls = { new URL...
classpath修改,相关jsp页面classpath修改
在Java编程环境中,`Classpath`(类路径)是一个至关重要的概念,它是Java虚拟机(JVM)查找和加载.class文件的路径。当我们在开发和运行Java程序时,正确配置Classpath是确保程序能正常运行的关键步骤。这篇文档将...
8. **动态加载**:在某些场景下,如插件系统,你可能需要在运行时动态修改`classpath`,这可以通过`ClassLoader`实现。 9. **理解依赖**:当你添加一个新的框架到项目中,你需要确保所有相关的依赖都被包含在`...
- 可以使用 `set CLASSPATH=路径`(Windows)或 `export CLASSPATH=路径`(Linux/Mac)来临时修改环境变量中的 classpath。 - 例如:`set CLASSPATH=E:\test`。 2. **持久化设置 Classpath**: - 在 Windows ...
在Eclipse中,可以通过右键点击项目 -> Build Path -> Configure Build Path来查看和修改项目的Classpath。在IntelliJ IDEA中,可以在Project Structure中调整模块的Classpath设置。 在处理复杂的项目时,有时会...
2. **修改Classpath变量:** - 在“系统变量”中找到名为`Classpath`的变量,如果没有,则新建一个。 - 设置其值为`. ; D:\Program Files\Java\jdk1.6.0_16\lib\dt.jar ; D:\Program Files\Java\jdk1.6.0_16\lib\...
一般在编辑Java文件或者C#文件时需要修改,设计到多个文件夹之间的切换时也可以根据自己的需要设置。简单的说就是,如果设置系统变量和用户变量,都叫做设置环境变量,设置系统变量时,该系统的所有帐号的用户都可以...
这些源代码包含了类库的实现,开发者可以通过阅读和修改源代码来理解和改进GNU Classpath的功能。同时,这个版本可能还包含了构建脚本、文档、测试用例,帮助开发者理解如何编译和测试Classpath,以及如何将其集成到...
- 编辑 `/etc/profile` 或 `~/.bashrc` 文件,在其中添加或修改 `CLASSPATH` 变量。 - 例如,可以在文件末尾添加以下内容: ```sh export CLASSPATH=/home/local/:/usr/local/ ``` #### 示例代码分析 在提供...
1. **Spring_demo_04_aop_introduction** - 这个例子可能是对Spring的面向切面编程(AOP)的介绍,AOP允许我们在不修改原有代码的情况下,实现如日志记录、性能监控等功能。 2. **Spring_demo_07_dataSource** - ...
4. **更新PATH变量**:修改系统的`PATH`变量,添加`%JAVA_HOME%\bin`到系统路径的开头位置,确保Java相关的工具如`javac`和`java`能够被系统识别。 完成上述配置后,可以在命令行中测试JDK是否配置成功,例如通过...
"java动态添加外部jar包到classpath的实例详解" Java 动态添加外部jar包到classpath是指在Java应用程序中动态地加载外部jar包到classpath中,以便在不重新启动服务器的情况下使用最新的代码。这项技术在项目开发...
在Eclipse中,当修改了这两个文件的任何一项内容,Eclipse都会实时更新项目配置,确保开发环境与实际需求保持一致。 至于标签"源码",它提醒我们关注的是项目中的代码组织和管理。在Eclipse中,源码通常按照包...
`bcel`(Byte Code Engineering Library)是一个强大的开源工具,允许开发者对Java字节码进行分析、生成和修改,从而实现动态类修改或者增强。 在Java开发中,动态类修改通常用于AOP(面向切面编程)、代码热部署、...
OSGi的核心概念是“bundle”,即模块化的JAR文件,它们可以有自己的类路径,并能动态地安装、启动、更新和卸载。本篇文章将深入探讨如何将classpath作为bundle发布在Felix框架中。 首先,我们需要了解OSGi的bundle...
Spring Boot Quartz 动态修改 Cron 表达式的方法 Spring Boot Quartz 动态修改 Cron 表达式的方法主要介绍了如何使用 Spring Boot 和 Quartz Framework 实现动态修改 Cron 表达式的方法。该方法可以使得开发者在不...
### CLASSPATH 和 PATH 的配置 #### 一、概述 在Java开发环境中,正确配置环境变量是确保程序能够正常编译和运行的关键步骤之一。本文主要介绍如何正确设置`CLASSPATH`与`PATH`这两个重要的环境变量,特别是针对...
当出现"The Eclipse JDT Core jar is not in the classpath"这样的错误时,意味着系统在运行时找不到Eclipse JDT Core库,这是一个关键的依赖,因为Drools使用它来编译和加载用户定义的Java代码,特别是那些由DRL...
- **灵活部署**: 开发者可以通过修改`CLASSPATH`来控制类文件的查找顺序,从而实现更灵活的部署方案。 - **解决类加载错误**: 设置正确的`CLASSPATH`可以避免`ClassNotFoundException`或`NoClassDefFoundError`等类...