java bean generator thrift of java bean config 自动配置一

昨天PM说要把微服务优化一个量级,因为用的是apache thrift 做RPC; 那首当其冲的就要把thrift 的gen-java 这个client手动生成操作痛点要解决 ;目前转换效果很差,BUT,这不重要,本文介绍的是使用java代码 在指定目录下执行DOS命令。这是一期,后期版本update定要做成类似generatorMybatisConfig.xml 的eclipse插件

开门见山关键点:

 Runtime.getRuntime().exec(command) 这句代码是执行系统命令的关键。

exec()函数有很多重构方法,主要包含如下
public Process exec(String command)-----在单独的进程中执行指定的字符串命令。
 
 public Process exec(String [] cmdArray)---在单独的进程中执行指定命令和变量
 
 public Process exec(String command, String [] envp)----在指定环境的独立进程中执行指定命令和变量
 
 public Process exec(String [] cmdArray, String [] envp)----在指定环境的独立进程中执行指定的命令和变量
 
 public Process exec(String command,String[] envp,File dir)----在有指定环境和工作目录的独立进程中执行指定的字符串命令
 
 public Process exec(String[] cmdarray,String[] envp,File dir)----在指定环境和工作目录的独立进程中执行指定的命令和变量
package com.generatorThrift;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

/**
 * 
 * @title alex of RPC SERVER CONFIG
 * @project thrift-generator平台
 * @note java bean generator thrift of java bean config
 * @author alex
 * @date 2018年8月5日
 */
public class TestThriftexe {

	public static void main(String[] args) {

		Runtime rt = Runtime.getRuntime();// java的API,获得一个对象

//			rt.exec("notepad.exe");// 与在cmd中输入一个notepad的效果一样的
//			try {
//				rt.exec("cmd /c cd d:\\java\\tools\\thrift\\thrift-0.9.3\\evshare  thrift -r --gen java	.\\IServiceEvreadyOrder.thrift");
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
			
		convert("IServiceEvreadyOrder.thrift","D:\\java\\tools\\thrift\\thrift-0.9.3\\evshare");
	}
	public static void convert(String filePath,String fileName){
		
		try {
			File dir = new File(filePath);//此处是指定路径	
			String[] cmd = new String[] { "cmd", "/c",  "thrift -r --gen java "+fileName};// cmd[2]是要执行的dos命令
			System.out.println(cmd[2]);
			Process process = Runtime.getRuntime().exec(cmd,null,dir);
				
			// 记录dos命令的返回信息  下面我没用到,因为thrift 指定了生产目录gen-java,待研究更优化
	           	 StringBuffer resStr = new StringBuffer();  
	           	 // 获取返回信息的流  
	           	InputStream in = process.getInputStream();  
	            	Reader reader = new InputStreamReader(in);  
	            	BufferedReader bReader = new BufferedReader(reader);  
	           	for (String res = ""; (res = bReader.readLine()) != null;) {  
	               		resStr.append(res + "\n");  
	                }  
	           	System.out.println(resStr.toString());
	            	bReader.close();  
	           	reader.close();  
	            	process.getOutputStream().close();  // 不要忘记了一定要关
	            
		    } catch (IOException e) {
				// TODO Auto-generated catch block
			e.printStackTrace();
		    }
		}

}

ps:特别鸣谢:小小小鸟blog

cmd /c dir 是执行完dir命令后关闭命令窗口。

cmd /k dir 是执行完dir命令后不关闭命令窗口。

cmd /c start dir 会打开一个新窗口后执行dir指令,原窗口会关闭。

cmd /k start dir 会打开一个新窗口后执行dir指令,原窗口不会关闭。

可以用cmd /?查看帮助信息。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
thrift-generator 是通过 Java 的接口生成 thrift 文件的工具。例子:public interface ICommonUserService {     public User login(int id, String name);     public User getUserById(long id);     public boolean saveUser(User user);     public List getUserIds(long id);      public Map getUserByIds(List ids);     public Map<String, List> getUsersByName(List names);     public Map<Long, List> getGroupUsers(List names, List userList, List lns, long ll);     public List testCase1(Map num1, List num2, List num3, long num4, String num5); } public class ThriftStructBuilderTest {     private ThriftFileBuilder fileBuilder = new ThriftFileBuilder();     @Test     public void toOutputstream() throws Exception {         this.fileBuilder.buildToOutputStream(ICommonUserService.class, System.out);     } }执行代码:mvn test -Dtest=com.sohu.thrift.generator.builder.ThriftStructBuilderTest之后控制台输出如下:namespace java com.sohu.thrift.generator.test.thrift     enum Status {             NORMAL = 0,             BLOCKED = 1     }     struct Account {             1:i32 id,             2:string name     }     struct User {             1:i32 id,             2:string name,             3:bool sex,             4:Status status,             5:list ids,             6:Account account     }     service ICommonUserService {             User login(1:i32 arg0,2:string arg1),             map<string, list> getUsersByName(1:list arg0),             bool saveUser(1:User arg0),             map getUserByIds(1:list arg0),             list getUserIds(1:i64 arg0),             map<i64, list> getGroupUsers(1:list arg0,2:list arg1,3:list arg2,4:i64 arg3),             User getUserById(1:i64 arg0),             list testCase1(1:map arg0,2:list arg1,3:list arg2,4:i64 arg3,5:string arg4)     }
### 回答1: 这个错误通常是由于缺少 mybatis-generator-core 依赖包所引起的。请确保在您的项目中正确地添加了该依赖包,并且该包的版本与您所使用的 Mybatis 版本相匹配。如果这不是问题的根本原因,请检查您的代码以查找其他可能引起此错误的问题。 ### 回答2: java.lang.NoClassDefFoundError: org/mybatis/generator/config/Context 是Java编程中的一个错误,它表示在运行时找不到类org.mybatis.generator.config.Context。 这个错误通常发生在使用MyBatis Generator生成代码时。MyBatis Generator是一个用于根据数据库表自动生成MyBatis持久层代码的工具。在生成代码之前,我们需要提供一个配置文件来指定代码生成的规则和目标。 通常情况下,出现java.lang.NoClassDefFoundError: org/mybatis/generator/config/Context错误的原因如下: 1. 没有正确地配置MyBatis Generator的classpath。在使用MyBatis Generator之前,我们需要确保相关的jar包都被正确地加入到编译和运行的classpath中。 2. 配置文件路径不正确。MyBatis Generator需要一个配置文件来指定生成代码的规则,如果配置文件路径不正确或配置文件中的路径配置不正确,就会导致无法找到org.mybatis.generator.config.Context类。 解决这个问题的方法如下: 1. 检查classpath配置。确认相关的jar包已经被正确地加入到项目的类路径中。 2. 检查配置文件路径。确认配置文件的路径配置正确无误,并且配置文件中的路径配置也正确无误。 3. 检查版本兼容性。确保使用的MyBatis Generator版本与项目中MyBatis和其他相关框架的版本兼容。不同版本之间可能存在一些不一致的地方,需要留意。 总结:java.lang.NoClassDefFoundError: org/mybatis/generator/config/Context是一个表示找不到类的错误。解决这个错误的方法包括检查classpath配置配置文件路径以及版本兼容性等方面。 ### 回答3: 这个错误是由于在运行Java程序时找不到org.mybatis.generator.config.Context类引起的。NoClassDefFoundError是指在编译期间已经找到了类的定义,但是在运行时找不到该类的定义。 解决这个问题的方法有以下几种: 1. 确保相关的jar包已经正确地添加到项目的Classpath中。在使用MyBatis Generator时,需要将mybatis-generator-core.jar和相关的依赖库添加到项目的Classpath中。 2. 检查类名的拼写错误。如果在引用Context类时发生了拼写错误,也会导致找不到类的定义。 3. 检查项目的依赖关系。如果项目中存在多个模块或者子项目,需要确保所有的依赖关系配置正确,并且相关的jar包已经正确地添加到每个模块的Classpath中。 4. 确保所使用的MyBatis Generator版本与项目的其他依赖库版本兼容。如果使用的MyBatis Generator版本与其他依赖库版本不兼容,也会导致找不到类的定义。 5. 确保Context类存在于所引用的jar包中,并且jar包的版本与项目的其他依赖库版本兼容。可以使用Java反编译工具查看所引用的jar包中是否存在Context类的定义。 总之,NoClassDefFoundError错误是由于找不到类的定义引起的,需要仔细检查项目的配置、依赖关系以及jar包的引用等方面,找到错误的原因并加以解决。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值