开发者社区> 技术小甜> 正文

Java 手动编译打包实践

简介:
+关注继续查看

假设有如下的目录结构: 


  1. D:\TMPMULU 
  2. └─mytest 
  3.     ├─AnotherPackage 
  4.     │      ClassPrintA.java 
  5.     │      ClassPrintB.java 
  6.     │      
  7.     └─mytestpkg 
  8.             Tj.java 

Tj.java类有个main方法,并且运行的时候要调用ClassPrintA和ClassPrintB类。

源代码分别如下:




  1. package
     mytest.AnotherPackage; 
  2. public class ClassPrintA { 
  3. public void PrintA() 
  4. System.out.print("AAAA"); 




  1. package
     mytest.AnotherPackage; 
  2. public class ClassPrintB { 
  3. public void PrintB() 
  4. System.out.print("BBBB"); 

 


 


  1. package mytest.mytestpkg; 
  2. import mytest.AnotherPackage.*; 
  3. public class Tj { 
  4. public static void main(String[] args) { 
  5. // TODO Auto-generated method stub 
  6. System.out.print("helllllllll"); 
  7. ClassPrintA ca=new ClassPrintA(); 
  8. ca.PrintA(); 
  9. ClassPrintB cb=new ClassPrintB(); 
  10. cb.PrintB(); 

 


现在的任务是把ClassPrintA和ClassPrintB编译打包成jar文件。

Tj类通过这个jar,一起编译。最后运行。

第一步,编译各个java类。

编译的话,不需要指定classpath。

通过命令javac编译。javac的具体参数可以下面地址查到:

http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/javac.html

在Cmd命令后,先对文件ClassPrintA和ClassPrintB编译。依次输入命令如下:

C:\Users\Administrator>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" D:\tmpm

ulu\mytest\AnotherPackage\ClassPrintA.java

C:\Users\Administrator>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" D:\tmpm

ulu\mytest\AnotherPackage\ClassPrintB.java98D7245E48EB40468AEB864AE95343B1

运行成功后,在D:\tmpmulu\mytest\AnotherPackage\目录下会有2个class文件。

第二步打包。

对这2个class文件打包,通过jar命令。Jar的使用细节,可以通过以下网址获得:

http://docs.oracle.com/javase/1.4.2/docs/tooldocs/windows/jar.html

注意,jdk的版本一定要正确。32位的装32位机器,64位的装64为机器。

运行命令:

要打包成jar文件,运行命令:

C:\Users\Administrator>"C:\Program Files\Java\jdk1.7.0_10\bin\jar.exe" cvf myjar.jar

D:\tmpmulu\mytest\AnotherPackage\ClassPrintA.class D:\tmpmulu\mytest\AnotherPac

kage\ClassPrintB.class

已添加清单

正在添加: D:/tmpmulu/mytest/AnotherPackage/ClassPrintA.class(输入 = 417) (输出 =

289)(压缩了 30%)

正在添加: D:/tmpmulu/mytest/AnotherPackage/ClassPrintB.class(输入 = 417) (输出 =

289)(压缩了 30%)

992B4F27D002495883995F2BDD3D530B

最后在C:\Users\Administrator\目录下得到myjar.jar。用解压软件打开看到:

C0CA63B3408E47F896848A55BFCE1693

显然,jar程序会根据你输入的路径结构来打包,因此把D盘都打了进去,这一点如果使用相对路径就不是很方便,因此,重新将当前目录切换到D:\TMPMULU\,再次打包。

A50E39876BB94A6EA3273586F7351230

这次得到的jar包的目录就是相对目录了。

0A01440479A844978CE15E89718FC3A2

第三步,编译Tj文件。

由于Tj代码中引用到了ClassPrintA和ClassPrintB,因此编译的时候,要么引入jar包,要么引入文件位置,两种方式都可以。

先看第一种,引入jar包。

引入jar包,就必须指定jar包文件的位置,为了避免类文件的干扰,先把类文件删除。

下面2个命令都可以

D:\tmpmulu>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" -cp .\myjar.jar D:\

tmpmulu\mytest\mytestpkg\Tj.java

D:\tmpmulu>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" -cp d:\tmpmulu\myja

r.jar D:\tmpmulu\mytest\mytestpkg\Tj.java

70E2143ABE3E45EA9494EA9D3038CA0C

在这种编译下,需要找到之前的jar包,因此通过设定环境变量。-cp .就是把环境变量设为当前路径。也可以写成绝对路径。

在没有jar包的境况下,可以通过设定环境变量,找类文件。这次,为了避免jar文件的干扰,先把jar文件删除。

D:\tmpmulu>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" -cp . D:\tmpmulu\my

test\mytestpkg\Tj.java

D:\tmpmulu>"C:\Program Files\Java\jdk1.7.0_10\bin\javac.exe" -cp d:\tmpmulu D:\t

mpmulu\mytest\mytestpkg\Tj.java

只要设定了环境变量,javac会从该路径找需要的类。

注意,Java中,Java类中包名必须要有对应的路径。就是说,要在某个文件夹中找到mytest.AnotherPackage.ClassPrintA这个类,必须在这个文件夹中找到mytest\AnotherPackage\ClassPrintA.class类,如果没有这样的目录结构,java认为没有找到该包,因此也没找到这样的类。因此,环境变量设为d:\tmpmulu后,在d:\tmpmulu路径下,有mytest\AnotherPackage这个的层次,因此也就能找到里面的类。

无论是引用的jar还是源文件,编译后都会在D:\tmpmulu\mytest\mytestpkg得到Tj.class。

可以尝试运行这个文件。

第四步 运行Tj类文件

运行类文件,也需要指定classpath,并且也是按照包的层次在目录结构中找类。

如果classpath指定为jar包,则不需要之前的类文件了,直接可以运行。但是要注意,类一定要按照包的层次结构放置。指定类名的时候,必须写全包名,设置环境变量的时候,注音不要漏了';'。

如下的命令:

D:\tmpmulu>java -cp d:\tmpmulu\myjar.jar; mytest.mytestpkg.Tj

helllllllllAAAABBBB

D:\tmpmulu>java -cp myjar.jar; mytest.mytestpkg.Tj

helllllllllAAAABBBB

D:\tmpmulu>java -cp .\myjar.jar; mytest.mytestpkg.Tj

helllllllllAAAABBBB

43AE5D35D75E4811B77F1328E66A71CD

当然,如果没有jar包,那也是可以的。

直接将环境变量社会class文件所在的位置,总之一定要让java找到那些类文件。

D:\tmpmulu>java -cp . mytest.mytestpkg.Tj

helllllllllAAAABBBB

D:\tmpmulu>java -cp .\ mytest.mytestpkg.Tj

helllllllllAAAABBBB

D:\tmpmulu>java -cp D:\tmpmulu mytest.mytestpkg.Tj

helllllllllAAAABBBB

925FDDF22B924AF38C05FA0DA40661FC

如果把运行的class移到别目录也可以,运行时只要保证java能找到那些class就行,比如,移到E:\testrun

那么首先保证类所在的位置和它的包名一致。 


  1. E:\TESTRUN 
  2. └─mytest 
  3.     └─mytestpkg 
  4.             Tj.class 

C:\Users\Administrator>java -cp d:\tmpmulu\myjar.jar;e:\testrun\;  mytest.mytest

pkg.Tj

6208FC25A08E46D698CEC98D41D9310D














本文转自cnn23711151CTO博客,原文链接:http://blog.51cto.com/cnn237111/1130134 ,如需转载请自行联系原作者










版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
java instrument机制分析与实践
1. 原理介绍java instrument是一种字节码增强技术,在jdk1.5开始已引入,其核心功能实现依赖java.lang.instrument.Instrumentation接口,通过实现该接口,我们可以对已加载和未加载的类进行修改。java instrumentation最常用的一种使用方式是通过jvm的启动参数:-javaagent来启动,例如:java -javaagent:myag
170 0
Java-购物车实践与应用
Java-购物车实践与应用
22 0
JUC系列(八)Java内存模型 volatile关键字与单例模式实践
JMM里有对于线程交换资源的一些约定 理解可以更好的参透JUC的内容 Volatile可以保证可见性和阻止操作系统的指令重排 理解多个不同的单例模式的实现方法
73 0
《Alibaba Dragonwell 基于Anolis OS的企业级Java应用规模化实践》电子版地址
Alibaba Dragonwell 基于Anolis OS的企业级Java应用规模化实践
29 0
Java:MyBatis动态SQL实践(2)
Java:MyBatis动态SQL实践
81 0
Java:MyBatis动态SQL实践(1)
Java:MyBatis动态SQL实践
52 0
干货分享!JAVA诊断工具Arthas在Rainbond上实践~
Arthas 是一款线上监控诊断产品,通过全局视角实时查看应用 load、内存、gc、线程的状态信息,并能在不修改应用代码的情况下,对业务问题进行诊断,包括查看方法调用的出入参、异常,监测方法执行耗时,类加载信息等,大大提升线上问题排查效率。
147 0
Dapr在Java中的实践 之 状态管理
状态管理(State Management)使用键值对作为存储机制,可以轻松的使长时运行、高可用的有状态服务和无状态服务共同运行在我们的服务中。
169 0
Dapr在Java中的实践 之 服务调用
通过服务调用(Service-to-service Invocation),服务可以使用 gRPC 或 HTTP 这样的标准协议来发现并可靠地与其他服务通信。Dapr采用边车(Sidecar)、去中心化的架构。 要使用Dapr来调用服务,可以在任意Dapr实例上使用invoke这个API。 边车编程模型鼓励每个服务与自己的Dapr实例对话。 Dapr实例会相互发现并进行通信。
358 0
Dapr在Java中的实践 之 环境准备
Dapr (Distributed Application Runtime)是一个可移植的、事件驱动的运行时,它使任何开发人员都可以轻松地构建运行在云和边缘上的弹性、无状态和有状态的应用程序,并支持语言和开发人员框架的多样性。Dapr利用Sidecar架构的优势,帮助我们解决构建微服务所带来的挑战,并保持代码与平台无关。
176 0
+关注
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Java工程师必读手册
立即下载
Java应用提速(速度与激情)
立即下载
Java单元测试实战
立即下载