`
qiuqiao2000
  • 浏览: 30733 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

为Java项目加载类路径

阅读更多

Studio利用hbm配置文件生成SQL文件时,需要访问ST项目中生成的POJO类,所以要把代码生成器(org.st.studio.generator.SqlGenerator)放在ST项目中进行加载,方法如下:

  1. 把要放在项目中加载和运行的类(org.st.studio.generator.SqlGenerator)的.class文件打包到一个studio.jar文件。其中org.st.studio.generator.SqlGenerator是一个包含public static void main(String[] args)可以作为Java Application运行的类。
    public class SqlGenerator {
    	
    	/**
    	 * @param args 包括3个参数:
    	 * <li>第一个参数: hbm文件的路径,各文件路径之间用“#”分隔
    	 * <li>第二个参数:输出文件目录
    	 * <li>第三个参数:输出文件路径
    	 * 
    	 * @throws ClassNotFoundException
    	 */
    	public static void main(String[] args) throws ClassNotFoundException {
    		if (args == null || args.length != 3)
    			return;
    		
    		Configuration cfg = new Configuration();
    		cfg.getProperties().put("hibernate.dialect",
    		    "org.hibernate.dialect.Oracle9Dialect");
    		
    		String hbmPaths = args[0];
    		StringTokenizer st = new StringTokenizer(hbmPaths, "#");
    		while (st.hasMoreElements()) {
    			String path = st.nextElement().toString();
    			File file = new File(path);
    			if(file.exists()){
    				cfg.addFile(file);
    			}
    		}
    	
    		SchemaExport se = new SchemaExport(cfg);
    		
    		File dir = new File(args[1]);
    		
    		//确保所有的父文件夹都存在
    		File temp = dir; 
    		while(!temp.getParentFile().getName().equals("") ){//父文件夹不是磁盘驱动器
    			temp = temp.getParentFile();
    			if(!temp.exists()){
    				temp.mkdir();
    			}
    		}
    		
    		if(!dir.exists() ){
    			dir.mkdir();
    		}
    		if( dir.exists() && dir.isDirectory()){
    			File file = new File(args[2]);
    			se.setOutputFile(args[2]);
    		}
    		
    		se.execute(true, false, false, false);
    	}
    }
     
  2. 通过某个触发点在ST项目中加载或删除studio.jar文件。在Studio中是通过org.eclipse.wst.common.project.facet.core.facets扩展点,在给ST项目添加facet时,添加org.st.studio.project.stnatureorg.springframework.ide.eclipse.core.springnature(修改.project文件),同时也添加jar包(修改.classpath文件)
                    /**
    	  * 在项目的classpath中添加studio.jar包
    	 * @param javaProject
    	 */
    	private void addExtenalJar(IJavaProject javaProject) {
    		try {
    			IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
    
    			IClasspathEntry entry = JavaCore.newLibraryEntry(
    					new Path(getJarPath()), null, null);
    			IClasspathEntry[] newEntries = new IClasspathEntry[oldEntries.length + 1];
    			System.arraycopy(oldEntries, 0, newEntries, 0, oldEntries.length);
    			newEntries[oldEntries.length]=entry;
    			javaProject.setRawClasspath(newEntries, null);
    		} catch (JavaModelException e) {
    			e.printStackTrace();
    		}
    	}
                    /**
    	 * @return 返回studio.jar的路径
    	 */
    	private String getJarPath() {
    		URL url = Platform.getBundle(SpringUIPlugin.PLUGIN_ID).getEntry(STUDIO_ JAR);
    		try {
    			return FileLocator.toFileURL(url).getFile();
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    		return null;
    	}
    	/**
    	 * 从项目的classpath中删除studio.jar包
    	 * @param javaProject
    	 */
    	private void removeExtenalJar(IJavaProject javaProject){
    		try {
    			IClasspathEntry[] oldEntries = javaProject.getRawClasspath();
    			List<IClasspathEntry> list=new ArrayList<IClasspathEntry>();
    			for(IClasspathEntry entry:oldEntries){
    				if(!(entry.getEntryKind()==IClasspathEntry.CPE_LIBRARY && STUDIO_JAR.equals(entry.getPath().toFile().getName())) ){
    					list.add(entry);
    				}
    			}
    			IClasspathEntry[] newEntries =(IClasspathEntry[])list.toArray(new IClasspathEntry[]{});
    
    			javaProject.setRawClasspath(newEntries, null);
    		} catch (JavaModelException e) {
    			e.printStackTrace();
    		}
    	} 
分享到:
评论

相关推荐

    Java类加载器.pdf

    3. **System ClassLoader(系统类加载器)**:也称为应用程序类加载器,它负责加载用户类路径(ClassPath)上指定的类。 每个类加载器都有其父类加载器,除了启动类加载器没有父加载器。当请求加载一个类时,如果...

    java类加载器

    类加载器在Java中扮演着至关重要的角色,不仅负责加载类,还维护了类的层次关系,确保了系统的稳定性和安全性。通过理解和掌握类加载器的工作原理及其不同类型的加载器,可以帮助开发者更好地管理Java应用程序的依赖...

    Java 自动加载JAR文件并运行其中的类方法

    2. **添加到ClassPath**:Java虚拟机(JVM)通过类路径(ClassPath)寻找类文件。使用`URLClassLoader`,我们可以动态地将JAR文件添加到当前的类路径中。示例代码如下: ```java File jarFile = new File("path_...

    JAVA读取同一路径下所有类及其方法

    在加载类时,我们使用 `ClassLoader` 来加载类。这个过程中,我们需要使用 `defineClass` 方法来定义类,然后使用 `getDeclaredMethods` 方法来获取该类的所有方法。 方法的遍历 在获取了所有类后,我们需要遍历每...

    Java类动态加载(一)——java源文件动态编译为class文件

    动态加载类通常涉及自定义ClassLoader,这是因为它允许我们覆盖默认的加载行为,例如从网络、数据库或其他非标准位置加载类。 对于Java源文件动态编译,我们可以使用Java的内置工具`javac`或`javax.tools.Java...

    Java类加载器原理

    - 系统(System)类加载器:也称为应用程序类加载器,由AppClassLoader实现,加载系统的类路径(CLASSPATH)中指定的类库。 3. 加载器委托加载机制: 类加载器遵循“双亲委派模型”(Delegation Model)。当一个...

    使用Java类加载和类路径实现一个简单的在线购物网站.txt

    通过以上介绍,我们可以看到Java的类加载机制和类路径管理在开发实际项目中的重要性。在构建如在线购物网站这样的应用时,合理利用这些特性能够帮助我们更好地组织和管理代码,提高程序的可维护性和扩展性。此外,本...

    Java类加载内幕详细讲解

    它的类路径通常由`java.class.path`系统属性指定。 #### 五、类加载过程详解 类加载的过程主要分为三个阶段:加载(Loading)、连接(Linking)和初始化(Initialization)。 1. **加载**(Loading): - 类加载...

    java项目相对路径与绝对路径问题分析

    5. `ClassLoader.getSystemResource("")`:这个方法返回的是系统类加载器的ClassPath的绝对URI路径,同样对应于`file:/D:/java/eclipse32/workspace/jbpmtest3/bin/`。 选择哪种方法取决于你的具体需求。如果你需要...

    java路径解决方案

    类路径是Java虚拟机(JVM)寻找类文件的路径集合,它决定了哪些目录和.jar文件被JVM用于加载类。默认情况下,Java会搜索当前目录("."),但通常我们需要自定义类路径以包含项目中的库和其他依赖。可以通过以下方式...

    Java 动态加载jar文件示例

    它们按照层次结构工作,遵循"委托模型",即从顶层的启动类加载器开始尝试加载类,如果找不到则逐级向下委托。 要实现动态加载jar文件,我们需要创建自定义的类加载器。这个类加载器需要继承`java.lang.ClassLoader`...

    JAVA中获取各种路径

    综上所述,Java中路径的获取涉及到多个层次,包括JSP、类路径以及Servlet层面,每种方法都有其特定的应用场景和作用。理解并熟练掌握这些路径获取方式,对于Java开发者尤其是Web应用开发者而言,是不可或缺的基础...

    自定义Java类加载器

    Java类加载器是Java虚拟机(JVM)的关键组成部分,它负责查找并加载类到内存中,使得程序能够运行。自定义Java类加载器允许我们根据特定需求扩展默认的加载机制,例如,从非标准位置加载类或者实现动态加载。在Java...

    反射,动态加载指定类调用类中的方法

    1. 加载类:使用`Class.forName()`加载指定的类。 2. 获取方法:使用`getMethod()`或`getDeclaredMethod()`,传入方法名和参数类型,获取`Method`对象。 3. 创建对象:如果需要,使用`Constructor.newInstance()`...

    Java类加载原理解析

    这些类加载器遵循双亲委派机制,即子类加载器在接收到加载类的请求时,会先将任务委托给其父加载器,直至顶级的启动类加载器。如果父加载器无法找到或加载类,子加载器才会尝试自己加载,这种机制能保证核心类库的...

    JAVA获取各种路径总结

    2. **Java类路径获取的通用方法** - **使用 `getResource` 和 `getResourceAsStream` 方法** - 示例: - `getClass().getResourceAsStream(filePath);` (`filePath` 例如为 "/filename",默认从 WEB-INF/classes...

    动态加载类机制JAVA

    在Java编程语言中,动态加载类机制是一种强大的功能,它允许程序...通过理解并熟练掌握这些知识点,开发者可以构建更加灵活、可维护的Java应用程序,尤其在处理大型项目和分布式系统时,动态加载类机制的价值更为凸显。

    java应用程序类加载器,ClassLoader for java Application

    总结来说,Java应用程序类加载器是Java程序执行的关键部分,它负责在运行时找到并加载类,而它的灵活性和可配置性为开发者提供了强大的能力来适应各种复杂的应用场景。理解并掌握类加载器的工作原理,能帮助我们更好...

    ClassLoader类加载器

    在Java编程语言中,ClassLoader是一个至关重要的组成部分,它负责加载类到JVM(Java虚拟机)中。了解和掌握ClassLoader的工作原理以及如何自定义ClassLoader对于深入理解Java应用程序的运行机制非常有帮助。以下是对...

Global site tag (gtag.js) - Google Analytics