我正在开源项目。截至目前,我没有任何课程的定制。因此使用opensource项目提供的所有jar文件。我的问题是,如果我修改一个java文件,编译它并将它打包成具有相同文件夹结构的新jar文件,那么在启动服务器或运行时会出现问题吗?如果不是将调用哪个类文件(默认文件或我的定制java类文件)?如果将相同的类打包到两个jar文件中,将调用哪个java类文件?
回答
事实上,这取决于很多因素:
如果这两个jar文件都在同一类,例如Java类路径(
-cp
选项),通常应该是在罐子里找到的第一个文件列表顺序。如果部署在JavaEE容器中(如EAR文件或
WEB-INF/lib
或WAR文件中),则不保证容器将在两个初创公司之间加载相同的类。在这种情况下,唯一肯定的是,WEB-INF/classes
之前WEB-INF/lib
搜索在复杂的类加载器的层次结构,默认的行为是家长第一次搜索,但JavaEE的实现已经推出了像父母最后一个策略(的WebSphere)或过滤机制由于部署描述符(的WebLogic)
的选择可能是jar file dependencies在META-INF/MANIFEST.MF
文件由于申报的Class-Path
属性。它应该在ClassLoader级别强制执行加载顺序,特别是在使用java -jar myapp.jar
启动时,但它可能取决于JavaEE上下文中的实现。
备注:当使用OpenSource项目时,提交更改请求并发布更改或改进以便社区从中受益可能是公平的。然后,您的项目可能会更新为主流,而ClassPath中没有这种通配符的困难。
如您所说如果两个jar文件都在同一个ClassLoader中,例如Java classpath(-cp选项),通常它应该是第一个以jar列表顺序找到的文件。但是,第二点,你说过,如果在tomcat中部署在webcontainer中的war文件是这种情况,那么将不会保证哪个类文件被调用。那是对的吗? – 2012-03-18 11:48:47
还有一点。你说一个选项可能是由于Class-Path属性在META-INF/MANIFEST.MF文件中声明jar文件依赖关系。它应该在ClassLoader级别执行加载顺序,但它可能取决于JavaEE上下文中的实现。只是为了确认我的理解,如果A类包装在两个jar文件J1和J2中。 A类从B类调用(J3包装)。现在如果我们想从JJ中调用A类,那么我们需要在jar J3的清单文件中提到这一点。正确? – 2012-03-18 12:07:38
是的。 J3清单必须包含Class-Path:j2.jar,J2清单必须包含Class-Path:j1.jar。所以它首先执行加载顺序:j3,然后是j2,然后是j1。当使用Main-Class属性打包时特别有用。 – 2012-03-19 07:53:06
类加载器寻找在需要资源位于首位。这意味着如果具有相同名称和包装的班级出现在2个瓶子中,则会使用第一个找到的班级。第一个是哪一个?根据类路径:举例来说,如果A类出现在罐子one.jar和two.jar和您的命令行是:
java -cp one.jar;two.jar
MyMain`
从one.jar版本将被使用。但是,如果命令行是
java -cp two.jar;one.jar
MyMain`
从two.jar类将被实例化。
你有参考文献说这是*指定/记录*行为吗?我[没有看到一个](http://stackoverflow.com/questions/9757279/how-jvm-works-when-two-same-jar-be-included-in-classpath/9757720#9757720)。 – 2012-03-18 10:58:17
当它是'java -cp/src/lib/* MyMain'和lib目录包含one.jar和two.jar时会发生什么? – enator 2017-11-03 12:23:08
- 1. 同一个jar文件中的两个相同的类
- 2. 如何将java类添加到jar文件中的文件夹
- 3. 每个类在jar文件中有两个类文件
- 4. 我可以将同一个java包的类文件拆分为Tomcat上的jar文件和classes文件夹吗?
- 5. 动态管理两个具有相同包名和类名的jar文件
- 6. Java:如何知道给定类名使用哪个jar文件?
- 7. 在两个不同的jar文件中区分相同的类名
- 8. 需要用于不同类的jar文件的两个版本
- 9. 如何在单个css文件中包含两个相同的类?
- 10. 将几个相同类型的对象添加到XML文件
- 11. 执行使用jar文件中的类的java类文件
- 12. Java - 从jar文件创建一个类
- 13. 两个* .jar文件中的相同插件
- 14. 哪个jar文件包含Hbase的RowCounter类
- 15. 如何将新的java类添加到jar文件中的现有类
- 16. 如何将java文件包含在.jar文件中?
- 17. 将所有文件打包到一个
- 18. java类文件到jar应用程序
- 19. 如何将文件包含到我的jar文件中?
- 20. Java:如何将jar外的.properties文件包含到classpath中?
- 21. 一个Java文件,但两个类
- 22. 宏将java分类为多个文件
- 23. 如何将一个静态类保存到Java文件中?
- 24. 使用两个类在同一个Java文件
- 25. 从第二个jar文件中调用一个类
- 26. Java - 将参考库打包成jar文件并重新使用
- 27. 将两个.IDL文件或两个.tlb文件合并到一个文件中
- 28. 如何在一个jar文件中确定一类的包名
- 29. 在NetBeans中将jar文件包含在另一个jar文件中
- 30. 多个Xib文件 - 相同的类
我相信JVM会使用它可以在类路径中找到的第一个jar文件中的类。而类似的问题已经回答了今天本身 “JVM是如何工作的,当两个相同的jar包含在类路径”的[JVM是如何工作的,当两个相同的jar包含在类路径( – sachinrahulsourav 2012-03-18 10:45:50
可能重复http://stackoverflow.com/问题/ 9757279/how-jvm-works-when-two-same-jar-include-in-classpath) – 2012-03-18 10:50:26