- 浏览: 3057703 次
- 性别:
- 来自: 海外
文章分类
- 全部博客 (430)
- Programming Languages (23)
- Compiler (20)
- Virtual Machine (57)
- Garbage Collection (4)
- HotSpot VM (26)
- Mono (2)
- SSCLI Rotor (1)
- Harmony (0)
- DLR (19)
- Ruby (28)
- C# (38)
- F# (3)
- Haskell (0)
- Scheme (1)
- Regular Expression (5)
- Python (4)
- ECMAScript (2)
- JavaScript (18)
- ActionScript (7)
- Squirrel (2)
- C (6)
- C++ (10)
- D (2)
- .NET (13)
- Java (86)
- Scala (1)
- Groovy (3)
- Optimization (6)
- Data Structure and Algorithm (3)
- Books (4)
- WPF (1)
- Game Engines (7)
- 吉里吉里 (12)
- UML (1)
- Reverse Engineering (11)
- NSIS (4)
- Utilities (3)
- Design Patterns (1)
- Visual Studio (9)
- Windows 7 (3)
- x86 Assembler (1)
- Android (2)
- School Assignment / Test (6)
- Anti-virus (1)
- REST (1)
- Profiling (1)
- misc (39)
- NetOA (12)
- rant (6)
- anime (5)
- Links (12)
- CLR (7)
- GC (1)
- OpenJDK (2)
- JVM (4)
- KVM (0)
- Rhino (1)
- LINQ (2)
- JScript (0)
- Nashorn (0)
- Dalvik (1)
- DTrace (0)
- LLVM (0)
- MSIL (0)
最新评论
-
mldxs:
虽然很多还是看不懂,写的很好!
虚拟机随谈(一):解释器,树遍历解释器,基于栈与基于寄存器,大杂烩 -
HanyuKing:
Java的多维数组 -
funnyone:
Java 8的default method与method resolution -
ljs_nogard:
Xamarin workbook - .Net Core 中不 ...
LINQ的恶搞…… -
txm119161336:
allocatestlye1 顺序为 // Fields o ...
最近做的两次Java/JVM分享的概要
这是回复这个回复的帖。放个例子来说明Java的package与JAR包的关系(或者说没关系?)
Java/JVM要认定某两个类型是否属于同一个runtime package,只需要看这两个类型是不是由同一个classloader加载的、并且package的全限定名完全一样;跟这两个类型是从什么地方加载过来的没关系。
举例说明。假设有这样的目录结构:
其中A.java为:
B.java为:
Main.java为:
通过下面步骤来编译:
可以看到编译没任何问题。
现在目录结构变为:
此时A.class与B.class分别分布在myjar1.jar与myjar2.jar中。
为了避免嫌疑,把ab/cd/ef里的.class文件都删除掉,变为:
然后执行Main:
运行没任何问题。说明在不同JAR包里的A与B之间能互相“找到”,Main也能找到它们俩;A与B仍然在同一个runtime package中。
相关代码都放在附件里了。
Java/JVM要认定某两个类型是否属于同一个runtime package,只需要看这两个类型是不是由同一个classloader加载的、并且package的全限定名完全一样;跟这两个类型是从什么地方加载过来的没关系。
举例说明。假设有这样的目录结构:
D:\TESTPACKAGE │ Main.java │ └─ab └─cd └─ef A.java B.java
其中A.java为:
package ab.cd.ef; public class A { public B makeB() { return new B(); } }
B.java为:
package ab.cd.ef; public class B { }
Main.java为:
import ab.cd.ef.A; import ab.cd.ef.B; public class Main { public static void main(String[] args) { B b = new A().makeB(); System.out.println(b); } }
通过下面步骤来编译:
D:\testpackage>javac ab/cd/ef/A.java D:\testpackage>jar cvf myjar1.jar ab/cd/ef/A.class 标明清单(manifest) 增加:ab/cd/ef/A.class(读入= 277) (写出= 202)(压缩了 27%) D:\testpackage>jar cvf myjar2.jar ab/cd/ef/B.class 标明清单(manifest) 增加:ab/cd/ef/B.class(读入= 185) (写出= 159)(压缩了 14%) D:\testpackage>javac -classpath "myjar1.jar;myjar2.jar" Main.java
可以看到编译没任何问题。
现在目录结构变为:
D:\TESTPACKAGE │ Main.class │ Main.java │ myjar1.jar │ myjar2.jar │ └─ab └─cd └─ef A.class A.java B.class B.java
此时A.class与B.class分别分布在myjar1.jar与myjar2.jar中。
为了避免嫌疑,把ab/cd/ef里的.class文件都删除掉,变为:
D:\TESTPACKAGE │ Main.class │ Main.java │ myjar1.jar │ myjar2.jar │ └─ab └─cd └─ef A.java B.java
然后执行Main:
D:\testpackage>java -classpath ".;myjar1.jar;myjar2.jar" Main ab.cd.ef.B@1fb8ee3
运行没任何问题。说明在不同JAR包里的A与B之间能互相“找到”,Main也能找到它们俩;A与B仍然在同一个runtime package中。
相关代码都放在附件里了。
- testpackage.zip (2.6 KB)
- 下载次数: 13
发表评论
-
The Prehistory of Java, HotSpot and Train
2014-06-02 08:18 0http://cs.gmu.edu/cne/itcore/vi ... -
MSJVM and Sun 1.0.x/1.1.x
2014-05-20 18:50 0当年的survey paper: http://www.sym ... -
Sun JDK1.4.2_28有TieredCompilation
2014-05-12 08:48 0原来以前Sun的JDK 1.4.2 update 28就已经有 ... -
IBM JVM notes (2014 ver)
2014-05-11 07:16 0Sovereign JIT http://publib.bou ... -
class data sharing by Apple
2014-03-28 05:17 0class data sharing is implement ... -
Java 8与静态工具类
2014-03-19 08:43 16324以前要在Java里实现所谓“静态工具类”(static uti ... -
Java 8的default method与method resolution
2014-03-19 02:23 10486先看看下面这个代码例子, interface IFoo { ... -
HotSpot Server VM与Server Class Machine
2014-02-18 13:21 0HotSpot VM历来有Client VM与Server V ... -
Java 8的lambda表达式在OpenJDK8中的实现
2014-02-04 12:08 0三月份JDK8就要发布首发了,现在JDK8 release c ... -
GC stack map与deopt stack map的异同
2014-01-08 09:56 0两者之间不并存在包含关系。它们有交集,但也各自有特别的地方。 ... -
HotSpot Server Compiler与data-flow analysis
2014-01-07 17:41 0http://en.wikipedia.org/wiki/Da ... -
字符串的一般封装方式的内存布局 (1): 元数据与字符串内容,整体还是分离?
2013-11-07 17:44 22427(Disclaimer:未经许可请 ... -
字符串的一般封装方式的内存布局
2013-11-01 12:55 0(Disclaimer:未经许可请 ... -
关于string,内存布局,C++ std::string,CoW
2013-10-30 20:45 0(Disclaimer:未经许可请 ... -
对C语义的for循环的基本代码生成模式
2013-10-19 23:12 21897之前有同学在做龙书(第二版)题目,做到8.4的练习,跟我对答案 ... -
Java的instanceof是如何实现的
2013-09-22 16:57 0Java语言规范,Java SE 7版 http://docs ... -
oop、klass、handle的关系
2013-07-30 17:34 0oopDesc及其子类的实例 oop : oopDesc* ... -
Nashorn各种笔记
2013-07-15 17:03 0http://bits.netbeans.org/netbea ... -
《深入理解Java虚拟机(第二版)》书评
2013-07-08 19:19 0值得推荐的中文Java虚拟机入门书 感谢作者赠与的样书,以下 ... -
豆列:从表到里学习JVM实现
2013-06-13 14:13 48429刚写了个学习JVM用的豆列跟大家分享。 豆列地址:http: ...
相关推荐
如果第一个Jar包中的类被加载,那么第二个Jar包中的类将不会被加载。 Maven中的类加载 在Maven项目中,我们可以使用Maven插件来生成Jar文件。例如,我们可以使用Maven Assembly Plugin来生成一个包含所有依赖项的...
1. **解压JAR文件**:使用解压缩工具(如WinRAR、7-Zip或命令行的jar命令)将JAR文件解开到一个临时目录。例如,可以使用`jar xf jar-file-name.jar`命令解压。 2. **找到并修改class文件**:在解压后的目录中找到...
在Spring框架中,自动扫描(Auto-Component Discovery)是一个便捷的功能,它允许开发者无需显式配置每个Bean,而是通过指定包名让Spring自动发现并管理Bean。然而,当Bean定义在独立的jar包中,有时Spring可能无法...
在Java开发过程中,我们经常会遇到一个头疼的问题:jar包冲突。这是因为不同的库或者框架可能会包含相同类的不同版本,导致运行时出现错误。为了解决这个问题,开发者们开发了一款名为"jarjar"的工具,其核心功能是...
在Java开发中,尤其是Android项目,经常会遇到需要整合多个外部依赖库的情况,这些库通常以JAR(Java Archive)文件的形式存在。为了简化项目结构、减少资源占用以及方便管理,开发者有时会选择将多个JAR包合并成一...
【nescube12_package】是一款将NES(Nintendo Entertainment System)游戏转换为JAR格式的工具,主要用于在现代设备上运行经典的游戏。NES是任天堂在80年代推出的家用游戏机,其游戏文件通常以NES为扩展名。而JAR...
当我们在命令行中执行一个包含`main`方法的Java应用程序时,通常使用`java`命令来启动JVM(Java虚拟机)。对于独立的可执行Java程序,这些通常被打包成JAR(Java Archive)文件。本文将深入探讨如何在JAR包中执行...
生成JAR包是Java项目打包的一种常见方式,它用于将多个.class文件及相关资源文件打包成一个文件,便于程序的分发和部署。JAR文件的全称是Java Archive,本质上是一个ZIP格式的压缩文件,包含了一个清单文件...
2. **多包情况**:当项目中有多个包,每个包可能还有子包,类分散在不同的包下时,每个类的源文件顶部必须包含`package`语句,以指定其所在的包。如果要使用其他包中的类,必须在源文件头部使用`import`语句导入需要...
2. `jdbc-driver.jar`:根据数据库类型选择相应的JDBC驱动,例如MySQL的`mysql-connector-java.jar`。 3. `slf4j-api-x.x.x.jar`:日志处理框架,用于记录程序运行日志。 4. `slf4j-simple-x.x.x.jar`或`logback-...
2. 类移动:可以将类从一个包移到另一个包,以适应不同的项目结构需求。 3. 合并JAR:可以将多个JAR文件合并为一个,减少项目中的依赖数量,提高应用启动速度。 4. 规则定义:jarjar支持自定义规则文件,通过这些...
在打包时,确保`config`目录与生成的JAR文件在同一层级。这样,程序运行时就能找到并读取配置文件。 此外,你可能还需要考虑类加载器的问题。如果外部JAR包中包含类,这些类需要在运行时被正确加载。Eclipse默认...
然后,在Android Studio中,右键点击`libs`目录,选择`New` -> `Java Package`,创建一个包名与JAR包中的顶级包名相同的目录结构。 2. **添加依赖**: 在`build.gradle`文件(Module级别)中,添加以下代码到`...
3. **package配置**:在`struts.xml`中,可以创建多个包来组织Action,每个包有自己的拦截器栈和默认配置,这增强了代码的可复用性和可维护性。 4. **Action配置**:定义Action类,包括Action名称、结果和类映射。...
1. 把功能相似或相关的类或接口组织在同一个包中,方便类的查找和使用。 2. 包也采用了树形目录的存储方式,同一个包中的类名字是不同的,不同的包中的类的名字是可以相同的。 3. 包可以避免名字冲突,并限定了访问...
在Android开发中,有时我们需要将特定的功能模块,如一个Activity,封装成独立的库以便其他开发者可以方便地引入和调用。本知识点主要探讨如何将Android的Activity打包成jar包,并介绍如何在第三方项目中调用这个jar...
1. **效率提升**:手动输入每一个文件路径来创建JAR包是非常耗时的,而`package.txt`文件可以列出所有需要的文件,使得打包过程一键完成。 2. **易维护**:当项目结构改变时,只需更新`package.txt`,而不是修改脚本...
【Qt on Android调用Jar包】是一个重要的技术实践,它涉及到跨平台开发和Java与C++的交互。在Android平台上,Qt提供了一种强大的方式来创建原生应用程序,但有时我们可能需要集成已经存在的Java库(以.jar文件形式)...