如何执行apache thrift的java程序(如果可能,使用ant)
我已经在我的系统上安装了thrift,如何执行apache thrift的java程序(如果可能,使用ant),java,ant,command-line,compiler-errors,javac,Java,Ant,Command Line,Compiler Errors,Javac,我已经在我的系统上安装了thrift,~/thrift,如果有人能帮助我如何使用ant编译它,那就太好了 我已经用命令行完成了以下操作 我已经编写了一个apache thrift程序,可以在eclipse中执行它。我想从命令行开始 我的基本目录的树结构是: . ├── bin ├── lib │ ├── commons-codec-1.6.jar │ ├── commons-lang3-3.1.jar │ ├── commons-logging-1.1.1.jar │ ├── h
~/thrift
,如果有人能帮助我如何使用ant
编译它,那就太好了
我已经用命令行完成了以下操作
我已经编写了一个apache thrift程序,可以在eclipse中执行它。我想从命令行开始
我的基本目录的树结构是:
.
├── bin
├── lib
│ ├── commons-codec-1.6.jar
│ ├── commons-lang3-3.1.jar
│ ├── commons-logging-1.1.1.jar
│ ├── httpclient-4.2.5.jar
│ ├── httpcore-4.2.4.jar
│ ├── junit-4.4.jar
│ ├── libthrift-0.9.1.jar
│ ├── log4j-1.2.14.jar
│ ├── servlet-api-2.5.jar
│ ├── slf4j-api-1.5.8.jar
│ └── slf4j-log4j12-1.5.8.jar
└── src
├── FileMetaData.java
├── files
├── FileStoreImpl.java
├── FileStore.java
├── RFile.java
├── RFileMetadata.java
├── Server.java
├── Status.java
├── StatusReport.java
└── SystemException.java
4 directories, 20 files
src/Server.java
具有要执行的main
功能
我使用以下命令进行编译:
javac -classpath "lib/libthrift-0.9.1.jar:lib/slf4j-log4j12-1.5.8.jar:lib/slf4j-api-1.5.8.jar:lib/log4j-1.2.14.jar:lib/commons-logging-1.1.1.jar" -d bin src/*.java -Xlint:none
它会生成以下警告:
Note: Some input files use unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
但我对它没有意见,因为我只想在本地执行它,我已经在eclipse中执行过它,并且知道它可以工作
要从命令行运行,我尝试了以下命令:
cd bin
java Server
还是这个
java -classpath "lib/libthrift-0.9.1.jar:lib/slf4j-log4j12-1.5.8.jar:lib/slf4j-api-1.5.8.jar:lib/log4j-1.2.14.jar:lib/commons-logging-1.1.1.jar:bin" Server
我得到这个错误:
Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/thrift/transport/TTransportException
at java.lang.Class.getDeclaredMethods0(Native Method)
at java.lang.Class.privateGetDeclaredMethods(Class.java:2521)
at java.lang.Class.getMethod0(Class.java:2764)
at java.lang.Class.getMethod(Class.java:1653)
at sun.launcher.LauncherHelper.getMainMethod(LauncherHelper.java:494)
at sun.launcher.LauncherHelper.checkAndLoadMain(LauncherHelper.java:486)
Caused by: java.lang.ClassNotFoundException: org.apache.thrift.transport.TTransportException
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
... 6 more
您需要指定类路径,与编译时使用的路径相同: 您需要停留在项目的顶层文件夹中(即
bin
和lib
的父文件夹),并将bin
添加到类路径中
java -classpath "bin:lib/libthrift-0.9.1.jar:lib/slf4j-log4j12-1.5.8.jar:lib/slf4j-api-1.5.8.jar:lib/log4j-1.2.14.jar:lib/commons-logging-1.1.1.jar" Server
您可以将类打包到自己的jar中,并将其添加到类路径中
编辑
示例ant build.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<project name="project-template" basedir="." default="package">
<!-- properties -->
<property name="src" location="src" />
<property name="bin" value="bin" />
<property name="lib" value="lib" />
<property name="dist" value="dist" />
<property name="java.version.target" value="1.6" />
<property name="main.class" value="com.client.ClientMain" />
<property name="jarfile" value="${ant.project.name}.jar" />
<path id="compile.classpath">
<fileset dir="${lib}">
<include name="*.jar"/>
</fileset>
</path>
<!-- target package: create the jar file -->
<target name="package" depends="compile">
<jar jarfile="${dist}/${jarfile}" basedir="${bin}">
<zipgroupfileset dir="${lib}" includes="*.jar"/>
<manifest>
<attribute name="Main-Class" value="${main.class}"/>
</manifest>
</jar>
</target>
<!-- target compile: compile the source files -->
<target name="compile" depends="prepare">
<javac includeantruntime="false"
srcdir="${src}" destdir="${bin}" debug="false" optimize="true"
target="${java.version.target}">
<compilerarg value="-Xlint:all -verbose -deprecation"/>
<classpath refid="compile.classpath"/>
</javac>
</target>
<!-- Create build directories as needed -->
<target name="prepare">
<mkdir dir="${bin}" />
<mkdir dir="${dist}" />
</target>
<target name="clean">
<delete includeemptydirs="true" verbose="true">
<fileset dir="${bin}" includes="**/*" />
<fileset dir="${dist}" includes="**/*" />
</delete>
</target>
</project>
@footy,我看到了问题所在,当你在bin
中尝试运行你的程序时,你无法访问lib/*
,如果你访问ls lib
,这甚至都不起作用。在bin
中,必须向类路径中的每个条目添加。/
。最好返回到项目的顶层,在类路径中添加bin
。查看我的编辑。我是从顶级目录本身进行编辑的,并将bin添加到类路径中。如果我能让ant
编译并运行它,那就太好了。@footy,既然你有Eclipse,为什么还要用ant呢?只需将您的项目导出为Runnable jar
,然后选择Package required libraries into generated jar
,我必须将其作为作业提交,并且我应该提供一个脚本来编译文件并在讲师的另一台机器上运行。只是一个上下文:我必须将其作为作业提交,并且我应该提供编译文件并在讲师的另一台机器上运行的脚本。