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










相关文章
|
22天前
|
Java Linux C语言
Java——输入输出及实践
Java——输入输出及实践
37 1
Java——输入输出及实践
|
22天前
|
监控 算法 Java
Java内存管理:垃圾收集器的工作原理与调优实践
在Java的世界里,内存管理是一块神秘的领域。它像是一位默默无闻的守护者,确保程序顺畅运行而不被无用对象所困扰。本文将带你一探究竟,了解垃圾收集器如何在后台无声地工作,以及如何通过调优来提升系统性能。让我们一起走进Java内存管理的迷宫,寻找提高应用性能的秘诀。
|
24天前
|
存储 监控 Java
Java多线程优化:提高线程池性能的技巧与实践
Java多线程优化:提高线程池性能的技巧与实践
47 1
|
9天前
|
监控 算法 Java
掌握Java的垃圾回收机制:从原理到实践
在Java的世界中,垃圾回收(Garbage Collection,简称GC)是一块神秘的领域,它如同一位默默无闻的清洁工,确保内存中不再使用的对象得到妥善处理。本文将带你走进垃圾回收的大门,探索它的工作原理、常见算法及其在实际应用中的调优策略。无论你是初学者还是有一定经验的开发者,这篇文章都将为你揭开垃圾回收的神秘面纱,让你的Java程序运行得更加高效和稳定。
23 5
|
15天前
|
数据采集 Java 数据挖掘
Java IO异常处理:在Web爬虫开发中的实践
Java IO异常处理:在Web爬虫开发中的实践
|
15天前
|
Java UED 开发者
Java中的异常处理:理解与实践
【9月更文挑战第3天】在Java编程中,异常处理是保持程序健壮性的关键。本文将引导你了解Java的异常机制,从基本的try-catch结构到自定义异常类的创建,以及如何优雅地处理异常情况。我们将一起探讨异常处理的最佳实践,并学习如何在代码中实现它们,以确保你的应用程序能够优雅地处理运行时错误。
13 2
|
20天前
|
Java Devops 持续交付
探索Java中的Lambda表达式:简化代码,提升效率DevOps实践:持续集成与部署的自动化之路
【8月更文挑战第30天】本文深入探讨了Java 8中引入的Lambda表达式如何改变了我们编写和管理代码的方式。通过简化代码结构,提高开发效率,Lambda表达式已成为现代Java开发不可或缺的一部分。文章将通过实际例子展示Lambda表达式的强大功能和优雅用法。
|
19天前
|
Java 调度
Java中的多线程基础与实践
【8月更文挑战第31天】本文将深入浅出地讲解Java中多线程的基础知识,并通过实例展示如何在Java程序中实现多线程。我们将从多线程的基本概念出发,逐步深入到线程的创建、控制以及同步机制,最后通过一个简易版的生产者消费者模型来实践这些知识点。文章旨在帮助初学者快速掌握多线程编程的关键技能,并理解其背后的原理。
|
22天前
|
Java 程序员 编译器
Java编程中的异常处理:理解与实践
【8月更文挑战第28天】在Java的世界中,异常是程序运行中不可避免的一部分。它们像是旅途中的路障,挑战着程序员的智慧和耐心。本文将带你走进Java的异常处理机制,从基础概念到高级应用,我们将一起探索如何优雅地处理这些不请自来的挑战者。你将学习到如何捕获、处理以及预防异常,确保你的代码像经验丰富的旅行者一样,即使在最崎岖的道路上也能从容前行。
|
23天前
|
机器学习/深度学习 人工智能 算法
探索人工智能在医疗诊断中的应用与挑战Java编程中的对象和类:基础与实践
【8月更文挑战第27天】随着人工智能(AI)技术的飞速发展,其在医疗领域的应用日益广泛。本文深入探讨了AI技术在医疗诊断中的具体应用案例,包括图像识别、疾病预测和药物研发等方面,并分析了当前面临的主要挑战,如数据隐私、算法偏见和法规限制等。文章旨在为读者提供一个全面的视角,理解AI在改善医疗服务质量方面的潜力及其局限性。