Ⅰ Compile,Make和Build的区别
在java的集成开发环境中,比如Eclipse、IDEA中,有常常有三种与编译相关的选项Compile、Make、Build三个选项。这三个选项最基本的功能都是完成编译过程。但又有很大的区别,区别如下:
1、Compile:只编译选定的目标,不管之前是否已经编译过。
2、Make:编译选定的目标,但是Make只编译上次编译变化过的文件,减少重复劳动,节省时间。(具体怎么检查未变化,这个就不用考虑了,IDE自己内部会搞定这些的)
3、Build:是对整个工程进行彻底的重新编译,而不管是否已经编译过。Build过程往往会生成发布包,这个具体要看对IDE的配置
了,Build在实际中应用很少,因为开发时候基本上不用,发布生产时候一般都用ANT等工具来发布。Build因为要全部编译,还要执行打包等额外工
作,因此时间较长。
Ⅱ java代码如何增量部署
那你就需要从SVN上拷下更新的代码(java文件),再在eclipse(ide)工具上编译成class,再替换掉原有的class文件
Ⅲ 如何用javac命令编译一个目录以及子目录下所有的java文件呢
不想一个一个写文件名,就应该想到如何生成命令行。人类进化的动力就是想吃饱又想偷懒。
::Windows
D:Workflow>dir/s/ad>dir.txt
然后用 notepad++ 打开替换命令行。
其实我想吐槽的是,这个年代有几个人还需要手工来执行最原始的命令行。像 ant 就很方便的处理这些东西。用 eclipse 也行啊。
一个 ant 样例:
java-classpathant.jar;ant-launcher.jarorg.apache.tools.ant.launch.Launcher-vbuild.xml
<!--filename:build.xml-->
<projectdefault="compile">
<targetname="compile">
<mkdirdir="bin"/>
<javacsrcdir="src"destdir="bin"/>
</target>
</project>
Ⅳ 在做java开发时,build和compile有什么联系和区别谢谢。
build会构建整个工程, compile只会编译工程,build包含compile, 是将源码解释后形成可执行文件。
命令行下的javac就是compile
java则是build。
在实际开发的时候这两个没太大区别, 只有部署的时候才会用到build。
Ⅳ 如何用maven将java8写的代码编译为java6平台的
在一般的Java应用开发过程中,开发人员使用Java的方式比较简单。打开惯用的IDE,编写Java源代码,再利用IDE提供的功能直接运行Java 程序就可以了。这种开发模式背后的过程是:开发人员编写的是Java源代码文件(.java),IDE会负责调用Java的编译器把Java源代码编译成平台无关的字节代码(byte code),以类文件的形式保存在磁盘上(.class)。Java虚拟机(JVM)会负责把Java字节代码加载并执行。Java通过这种方式来实现其“编写一次,到处运行(Write once, run anywhere)” 的目标。Java类文件中包含的字节代码可以被不同平台上的JVM所使用。Java字节代码不仅可以以文件形式存在于磁盘上,也可以通过网络方式来下载,还可以只存在于内存中。JVM中的类加载器会负责从包含字节代码的字节数组(byte[])中定义出Java类。在某些情况下,可能会需要动态的生成 Java字节代码,或是对已有的Java字节代码进行修改。这个时候就需要用到本文中将要介绍的相关技术。首先介绍一下如何动态编译Java源文件。
动态编译Java源文件
在一般情况下,开发人员都是在程序运行之前就编写完成了全部的Java源代码并且成功编译。对有些应用来说,Java源代码的内容在运行时刻才能确定。这个时候就需要动态编译源代码来生成Java字节代码,再由JVM来加载执行。典型的场景是很多算法竞赛的在线评测系统(如PKU JudgeOnline),允许用户上传Java代码,由系统在后台编译、运行并进行判定。在动态编译Java源文件时,使用的做法是直接在程序中调用Java编译器。
JSR 199引入了Java编译器API。如果使用JDK 6的话,可以通过此API来动态编译Java代码。比如下面的代码用来动态编译最简单的Hello World类。该Java类的代码是保存在一个字符串中的。
01 public class CompilerTest {
02 public static void main(String[] args) throws Exception {
03 String source = "public class Main { public static void main(String[] args) {System.out.println(\"Hello World!\");} }";
04 JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
05 StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
06 StringSourceJavaObject sourceObject = newCompilerTest.StringSourceJavaObject("Main", source);
07 Iterable< extends JavaFileObject> fileObjects = Arrays.asList(sourceObject);
08 CompilationTask task = compiler.getTask(null, fileManager, null,null, null, fileObjects);
09 boolean result = task.call();
10 if (result) {
11 System.out.println("编译成功。");
12 }
13 }
14
15 static class StringSourceJavaObject extends SimpleJavaFileObject {
16
17 private String content = null;
18 public StringSourceJavaObject(String name, String content) ??throwsURISyntaxException {
19 super(URI.create("string:///" + name.replace('.','/') + Kind.SOURCE.extension), Kind.SOURCE);
20 this.content = content;
21 }
22
23 public CharSequence getCharContent(boolean ignoreEncodingErrors) ??throws IOException {
24 return content;
25 }
26 }
27 }
如果不能使用JDK 6提供的Java编译器API的话,可以使用JDK中的工具类com.sun.tools.javac.Main,不过该工具类只能编译存放在磁盘上的文件,类似于直接使用javac命令。
另外一个可用的工具是Eclipse JDT Core提供的编译器。这是Eclipse Java开发环境使用的增量式Java编译器,支持运行和调试有错误的代码。该编译器也可以单独使用。Play框架在内部使用了JDT的编译器来动态编译Java源代码。在开发模式下,Play框架会定期扫描项目中的Java源代码文件,一旦发现有修改,会自动编译 Java源代码。因此在修改代码之后,刷新页面就可以看到变化。使用这些动态编译的方式的时候,需要确保JDK中的tools.jar在应用的 CLASSPATH中。
下面介绍一个例子,是关于如何在Java里面做四则运算,比如求出来(3+4)*7-10的值。一般的做法是分析输入的运算表达式,自己来模拟计算过程。考虑到括号的存在和运算符的优先级等问题,这样的计算过程会比较复杂,而且容易出错。另外一种做法是可以用JSR 223引入的脚本语言支持,直接把输入的表达式当做JavaScript或是JavaFX脚本来执行,得到结果。下面的代码使用的做法是动态生成Java源代码并编译,接着加载Java类来执行并获取结果。这种做法完全使用Java来实现。
01 private static double calculate(String expr) throws CalculationException {
02 String className = "CalculatorMain";
03 String methodName = "calculate";
04 String source = "public class " + className
05 + " { public static double " + methodName + "() { return " + expr +"; } }";
06 //省略动态编译Java源代码的相关代码,参见上一节
07 boolean result = task.call();
08 if (result) {
09 ClassLoader loader = Calculator.class.getClassLoader();
10 try {
11 Class<?> clazz = loader.loadClass(className);
12 Method method = clazz.getMethod(methodName, new Class<?>[] {});
13 Object value = method.invoke(null, new Object[] {});
14 return (Double) value;
15 } catch (Exception e) {
16 throw new CalculationException("内部错误。");
17 }
18 } else {
19 throw new CalculationException("错误的表达式。");
20 }
21 }
上面的代码给出了使用动态生成的Java字节代码的基本模式,即通过类加载器来加载字节代码,创建Java类的对象的实例,再通过Java反射API来调用对象中的方法。
Java字节代码增强
Java 字节代码增强指的是在Java字节代码生成之后,对其进行修改,增强其功能。这种做法相当于对应用程序的二进制文件进行修改。在很多Java框架中都可以见到这种实现方式。Java字节代码增强通常与Java源文件中的注解(annotation)一块使用。注解在Java源代码中声明了需要增强的行为及相关的元数据,由框架在运行时刻完成对字节代码的增强。Java字节代码增强应用的场景比较多,一般都集中在减少冗余代码和对开发人员屏蔽底层的实现细节上。用过JavaBeans的人可能对其中那些必须添加的getter/setter方法感到很繁琐,并且难以维护。而通过字节代码增强,开发人员只需要声明Bean中的属性即可,getter/setter方法可以通过修改字节代码来自动添加。用过JPA的人,在调试程序的时候,会发现实体类中被添加了一些额外的 域和方法。这些域和方法是在运行时刻由JPA的实现动态添加的。字节代码增强在面向方面编程(AOP)的一些实现中也有使用。
Ⅵ 如何用javac 和java 编译运行整个Java工程
前言 本文教你怎么用javac和java命令 以及如何利用脚本(shell或bat)方便处理 并用简单的实例展示这些用法
IDE是把双刃剑 它可以什么都帮你做了 你只要敲几行代码 点几下鼠标 程序就跑起来了 用起来相当方便 你不用去关心它后面做了些什么 执行了哪些命令 基于什么原理 然而也是这种过分的依赖往往让人散失了最基本的技能 当到了一个没有IDE的地方 你便觉得无从下手 给你个代码都不知道怎么去跑 好比给你瓶水 你不知道怎么打开去喝 然后活活给渴死
之前用惯了Myeclipse Java文件编译运行的命令基本忘得一干二净 现在项目出了原型 放到服务器上去测试 SSH一登陆上服务器就傻眼了 都是命令行 以前程序图标什么的都成了浮云 程序放上去了不知道怎么去编译运行 只能补补课了 下面做下补课笔记
一 javac命令javac 用于编译Java文件 格式为 java [options] [sourcefiles] [@files]其中 options 命令行选项 sourcefiles 一个或多个要编译的源文件 @files 一个或多个对源文件进行列表的文件 有时候要编译的文件很多 一个个敲命令会显得很长 也不方便修改 可以把要编译的源文件列在文件中 在文件名前加@ 这样就可以对多个文件进行编译 对编译一个工程很有用 方便 省事
有几个比较重要的选项 d 用于指定编译成的class文件的存放位置 缺省情况下不指定class文件的存放目录 编译的class文件将和源文件在同一目录下 classpath 可以简写成 cp 用于搜索编译所需的class文件 指出编译所用到的class文件的位置 如jar zip或者其他包含class文件的目录 指定该选项会覆盖CLASSPATH的设定 sourcepath用于搜索编译所需的源文件(即java文件) 指定要搜索的源文件的位置 如jar zip或其他包含java文件的目录 需要注意windows下和linux下文件路径分隔符和文件列表(即 classpath和 sourcepath指定的文件)分隔符的区别 windows下文件路径分隔符用 文件列表分隔符用分号 linux下文件路径分隔符用 / 文件列表分隔符用冒号 二 java命令java 用于执行程序 格式如下 java [options] classfile options 命令行选项 一般用于 classpath 指定要执行的文件所在的位置以及需要用到的类路径 包括jar zip和class文件目录 会覆盖CLASSPATH的设定三 脚本如果要敲的命令很长 每次要编译运行的时候都要重新敲一遍 这是一件很痛苦的事情 所以用脚本可以大大方便你的工作量 在linux下用shell脚本 windows下用bat批处理程序 因为是在linux下 我这里只是简单介绍一下shell 关于bat批处理程序的语法自己网络一下 不难
开头linux有很多不同的shell 通常使用bash(bourne again shell) 程序必须以下面的行开始 #!/bin/sh #!用来告诉系统用后面的参数来执行程序 这里使用的是/bin/sh要使你的脚本能够执行 还必须让这个文件有可执行权限 使用下面命令更改文件权限 chmod +x filename 注释以#开始的句子表示注释 一直到这行结束 多写注释有利于以后重新看的时候知道自己在做什么 变量shell的脚本的变量都是字符串 不用申明类型 定义的时候直接 变量=值 即可 用到变量的的时候用 $变量 或者 ${变量} echo命令用于打印 举个例子 #!/bin/sh # 定义变量words 值为hello world words= hello world # 打印变量words的值echo $words 命令shell脚本里面可以直接任意使用linux命令 要用到什么命令直接敲进去即可 记住一些常用的命令 cd 打开目录ls l 显示目录信息rm fr 递归删除目录及下面的文件 不提示信息mkdir 创建目录pwd 显示当前路径kill pid 强制杀掉某个进程号的进程pkill 杀掉某个名字的进程ps aux 显示运行进程信息netstat pan 查看网络端口监听情况四 例子下面是文件pile 用于编译整个java工程 把编译的文件放到指定目录下
view plain #!/bin/sh # Define some constants ONSSERVER=ONSServer PROJECT_PATH=/root/iot oid JAR_PATH=$PROJECT_PATH/lib BIN_PATH=$PROJECT_PATH/bin SRC_PATH=$PROJECT_PATH/src/$ONSSERVER
# First remove the sources list file if it exists and then create the sources file of the project rm f $SRC_PATH/sources find $SRC_PATH/ name * java > $SRC_PATH/sources list
# First remove the ONSServer directory if it exists and then create the bin directory of ONSServer rm rf $BIN_PATH/$ONSSERVER mkdir $BIN_PATH/$ONSSERVER
# Compile the project javac d $BIN_PATH/$ONSSERVER classpath $JAR_PATH/jdom jar $JAR_PATH/oro jar @$SRC_PATH/sources list下面是文件run 用于执行程序 view plain #!/bin/sh
# Define some constants ONSSERVER=ONSServer PROJECT_PATH=/root/iot oid JAR_PATH=$PROJECT_PATH/lib BIN_PATH=$PROJECT_PATH/bin
lishixin/Article/program/Java/hx/201311/27024