Studio利用hbm配置文件生成SQL文件时,需要访问ST项目中生成的POJO类,所以要把代码生成器(org.st.studio.generator.SqlGenerator)放在ST项目中进行加载,方法如下:
- 把要放在项目中加载和运行的类(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); } }
- 通过某个触发点在ST项目中加载或删除studio.jar文件。在Studio中是通过org.eclipse.wst.common.project.facet.core.facets扩展点,在给ST项目添加facet时,添加org.st.studio.project.stnature、org.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(); } }