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 ,如需转载请自行联系原作者










相关文章
|
13天前
|
Java 调度
Java并发编程:深入理解线程池的原理与实践
【4月更文挑战第6天】本文将深入探讨Java并发编程中的重要概念——线程池。我们将从线程池的基本原理入手,逐步解析其工作过程,以及如何在实际开发中合理使用线程池以提高程序性能。同时,我们还将关注线程池的一些高级特性,如自定义线程工厂、拒绝策略等,以帮助读者更好地掌握线程池的使用技巧。
|
28天前
|
安全 Java 调度
Java中的多线程编程:从理论到实践
【2月更文挑战第30天】本文旨在深入探讨Java中的多线程编程。我们将从基础的理论出发,理解多线程的概念和重要性,然后通过实际的Java代码示例,展示如何创建和管理线程,以及如何处理线程间的同步和通信问题。最后,我们还将讨论Java并发库中的一些高级特性,如Executor框架和Future接口。无论你是Java初学者,还是有经验的开发者,本文都将为你提供有价值的见解和实用的技巧。
|
1月前
|
XML Java 数据库连接
谈谈Java反射:从入门到实践,再到原理
谈谈Java反射:从入门到实践,再到原理
58 0
|
1月前
|
Java 程序员 索引
Java中的异常处理:理解、实践与最佳实践
【2月更文挑战第26天】在Java编程中,异常处理是一个重要的概念。它不仅帮助我们在程序出错时提供有关错误的详细信息,而且还允许我们以一种结构化的方式来处理这些错误。本文将深入探讨Java中的异常处理,包括如何创建自定义异常,如何使用try-catch-finally语句块,以及如何在实际编程中应用最佳实践。
26 3
|
14天前
|
Java 程序员 调度
Java中的多线程编程:基础知识与实践
【4月更文挑战第5天】 在现代软件开发中,多线程编程是一个不可或缺的技术要素。它允许程序员编写能够并行处理多个任务的程序,从而充分利用多核处理器的计算能力,提高应用程序的性能。Java作为一种广泛使用的编程语言,提供了丰富的多线程编程支持。本文将介绍Java多线程编程的基础知识,并通过实例演示如何创建和管理线程,以及如何解决多线程环境中的常见问题。
|
1月前
|
监控 Java 开发者
Java性能优化实践:提升你的应用效率
【2月更文挑战第12天】 在当今快速发展的软件行业中,性能优化是每个Java开发者都必须面对的挑战。本文将深入探讨Java性能优化的关键策略,从代码层面到架构设计,全方位提升应用的运行效率。我们将通过具体案例,展示如何诊断性能瓶颈、优化内存管理、提高并发处理能力,以及采用最新的Java技术栈改善应用性能。加入我们的旅程,一起探索如何让你的Java应用飞速运行。
23 2
|
9天前
|
Java 数据挖掘
java实践
【4月更文挑战第9天】java实践
12 1
|
2天前
|
负载均衡 Java 开发者
细解微服务架构实践:如何使用Spring Cloud进行Java微服务治理
【4月更文挑战第17天】Spring Cloud是Java微服务治理的首选框架,整合了Eureka(服务发现)、Ribbon(客户端负载均衡)、Hystrix(熔断器)、Zuul(API网关)和Config Server(配置中心)。通过Eureka实现服务注册与发现,Ribbon提供负载均衡,Hystrix实现熔断保护,Zuul作为API网关,Config Server集中管理配置。理解并运用Spring Cloud进行微服务治理是现代Java开发者的关键技能。
|
2天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
11天前
|
Java API UED
Java中的多线程并发编程实践
【4月更文挑战第7天】在现代软件开发中,多线程技术是提高程序性能和响应速度的重要手段。Java语言提供了丰富的多线程支持,包括线程的创建、管理和同步机制。本文将深入探讨Java多线程的基本概念、实现方式以及常见的并发问题,并通过实例代码演示如何高效地利用多线程技术。
10 1