首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

使用静态工厂方法时,fat jar中的主类会失败,但在IDE中工作正常

静态工厂方法是一种创建对象的设计模式,它通过在类中定义一个静态方法来创建对象,而不是使用构造函数。在使用静态工厂方法时,可能会遇到在fat jar中的主类失败的问题,但在IDE中工作正常的情况。

这个问题通常是由于类路径(classpath)的问题导致的。在IDE中,类路径是由IDE自动管理的,因此可以正确地找到并加载所需的类。但在fat jar中,所有的依赖库和类文件都被打包在一个jar文件中,这可能导致类路径的冲突或缺失。

为了解决这个问题,可以尝试以下几种方法:

  1. 检查依赖:确保所有的依赖库都正确地包含在fat jar中,并且没有冲突的版本。可以使用构建工具(如Maven或Gradle)来管理依赖,并确保所有的依赖都正确地添加到构建配置文件中。
  2. 检查类路径:确保在运行fat jar时,类路径正确地指向了所有需要的类和资源文件。可以使用命令行参数或脚本来设置类路径,或者使用特定的构建工具来配置类路径。
  3. 检查主类:确保在打包fat jar时,指定了正确的主类。主类是fat jar的入口点,如果指定的主类有问题,可能导致运行失败。可以通过检查构建配置文件或命令行参数来确认主类的正确性。
  4. 检查运行环境:确保在运行fat jar时,使用的是与IDE相同的运行环境。例如,如果在IDE中使用的是Java 8,那么在运行fat jar时也应该使用Java 8。

总结起来,解决使用静态工厂方法时fat jar中主类失败的问题,需要检查依赖、类路径、主类和运行环境等方面的配置。确保所有的依赖都正确地包含在fat jar中,并且类路径正确地指向了所需的类和资源文件。同时,确认指定的主类正确无误,并且在运行时使用与IDE相同的运行环境。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

当构造方法参数过多时使用builder模式

应该为这样编写什么样构造方法静态工厂?...它是 Builder 模式[Gamma95] 一种形式。客户端不直接调用所需对象,而是调用构造方法 (或静态工厂),并使用所有必需参数,并获得一个 builder 对象。...这与抽象self方法一起,允许方法链在子类中正常工作,而不需要强制转换。 Java 缺乏自我类型这种变通解决方法被称为模拟自我类型(simulated self-type)习惯用法。...但是,如果从构造方法静态工厂开始,并切换到 builder,当演化到参数数量失控时候,过时构造方法静态工厂就会面临尴尬处境。因此,所以,最好从一开始就创建一个 builder。   ...总而言之,当设计构造方法静态工厂参数超过几个,Builder 模式是一个不错选择,特别是如果许多参数是可选或相同类型

92930

Effective Java 2.0_Item 2_中文版

你应该为这样一个写什么样构造函数或静态工厂?...当一个对象处于一种不一致状态,试图使用它可能会引起失败,这个失败很难从包含错误代码中去掉,因此很难调试。...当构造工作完成,可以通过手动『冰冻』对象并且在冰冻完成之前不允许使用它来弥补这个缺点,但这种方式太笨重了,在实践很少使用。...如果你开始使用构造函数或静态工厂,当发展到参数数目开始失控情况下,才增加一个构建器,废弃构造函数或静态工厂就像一个疼痛拇指,最好是在开始就使用构建器。...总之,当设计构造函数或静态工厂有许多参数,构建器模式是一个很好选择,尤其是大多数参数是可选参数情况下。

24820

Java架构师教你写代码(二) - 使用建造者替代多参数构造器

这样怎么编写构造器或静态工厂? SE 通常使用可伸缩构造器模式:只向构造函数提供必需参数。...如果检查失败,抛 IllegalArgumentException,指示哪些参数无效。 4 建造者模式适于层次结构 使用构建器平行层次结构,每个构建器都嵌套在相应。...虽然在实践创建构建器成本可能不显著,但在性能场景,可能是问题 建造者模式比可伸缩构造器模式更冗长,只在有足够多参数时值得,≥4个使用吧 你可能在将来添加更多参数。...但是,如果以构造器或静态工厂开始,直至扩展到参数失控,也切换到构建器,但是过时构造器或静态工厂很难处理。...因此,最好一开始就从构建器开始 7 总结 在设计构造器或静态工厂,有许多参数是可选或具有相同类型,建造者模式是很好选择。

61010

效率编程 之「创建和销毁对象」

第 1 条:考虑用静态工厂方法代替构造器 可以提供一个公有的静态工厂方法,它只是一个返回示例静态方法。...特别地,在构造器参数不能够清晰地描述正被返回对象,那么具适当名称静态工厂更容易使用静态工厂方法与构造器不同第二大优势在于,不必在每次调用它们时候都创建一个新对象。...无法通过校验构造器参数有效性来保证一致性,试图使用处于不一致状态对象,将会导致失败。...其中,builder就是客户端构建静态成员!如果类构造器或者静态工厂具有多个参数,设计这种类,Builder模式就是种不错选择,特别是当大多数参数都是可选时候。...对于同时提供了静态工厂方法和构造器不可变,通常是优先使用静态工厂方法而不是构造器,以避免创建不必要对象。当然,除了重用不可变对象之外,也可以重用那些已知不会被修改可变对象。

49930

Effective Java 2.0_中英文对照_Item 2

当一个对象处于一种不一致状态,试图使用它可能会引起失败,这个失败很难从包含错误代码中去掉,因此很难调试。...当构造工作完成,可以通过手动『冰冻』对象并且在冰冻完成之前不允许使用它来弥补这个缺点,但这种方式太笨重了,在实践很少使用。...Java传统抽象工厂实现是对象,newInstance方法扮演着build方法角色。 这种用法问题重重。newInstance方法总是尝试调用无参构造函数,但无参构造函数可能并不存在。...如果你开始使用构造函数或静态工厂,当发展到参数数目开始失控情况下,才增加一个构建器,废弃构造函数或静态工厂就像一个疼痛拇指,最好是在开始就使用构建器。...总之,当设计构造函数或静态工厂有许多参数,构建器模式是一个很好选择,尤其是大多数参数是可选参数情况下。

31620

【Effective Java】Ch2_创建销毁对象:Item2_当构造函数参数过多时考虑使用builder

参考链接: Java构造函数链接(带示例) 静态工厂和构造函数都有一个限制:可选参数数量很大,他们都不能很好地扩展。...——build相当于冻结方法          builder是所要构建一个静态成员(Item22)。...虽然创建builder开销在实践可能不那么明显,但在某些注重性能情况下可能会有问题。...不过,要记住你在将来也许会想增加参数,如果你一开始就使用构造函数或静态工厂,那当参数数目失控就得增加builder了,此时被废弃构造函数或静态工厂就会像个怪物一样杵在那儿。...所以,通常最好一开始就使用builder。          总之,当所设计构造函数或静态工厂拥有过多参数,Builder模式是个不错选择,尤其当大多数参数可选时候。

44420

Effective Java(一)

TRUE : FALSE); } 注意:静态工厂方法与设计模式工厂方法(Factory Method)模式不同。本条目中所指静态工厂方法并不直接对应于设计模式工厂方法。...方法返回对象所属,在编写包含该静态工厂方法可以不存在 缺点 如果不含公有的或者受保护构造器,就不能被子类化 程序员很难发现它们,API文档没有明确标识出来 总结 简而言之,静态工厂方法和公有构造器都各有用处...静态工厂经常更加合适,因此切忌第一反应就是提供公有的构造器,而不先考虑静态工厂 遇到多个构造器参数要考虑使用构建器 静态工厂和构造器有个共同局限性:它们都不能很好地扩展到大量可选参数。...如果一开始就使用构造器或者静态工厂,等到需要多个参数才添加构造器,就会无法控制,那些过时构造器或者静态工厂显得十分不协调。因此,通常最好一开始就使用构建器。...静态工厂方法(static factory method) 对于同时提供了静态工厂方法(static factory method)和构造器不可变,通常优先使用静态工厂方法而不是构造器,以避免创建不必要对象

62410

java与es8实战之一:以builder pattern开篇

,这个思路要加多少synchronize或ReentrantLock 所以构造方法不能满足我们实际需要,再来看看静态工厂方法,它优势在哪里 静态工厂方法优势 相比静态工厂方法,构造方法存在以下五个典型问题...:方法返回对象所属,在编写此静态方法可以不存在,这句话有点晦涩,可以回想一下JDBC获取connectionAPI,在编写此API时候,并不需要知道MySQLdriver实现 以上比较暴露出构造方法缺陷...静态工厂方法不足 只有最合适,没有最好静态工厂方法也有自己不足 当您开发一个,如果决定对外提供静态工厂方法,那么将构造方法设为私有,就可以让用户只能选择静态工厂方法了,代码如下所示,然而,...,可能已有一些静态方法,再加入静态工厂方法,一堆静态方法混杂在一起,用户从中找出静态工厂方法怕是不容易 builder pattern 看过了构造方法静态工厂方法,认识到它们不足,终于该第三种方法登场了...小结如下图 看到这里,不知您是否击掌叫好,builder与lambda巧妙结合,整个套路,第二步留给使用者按需定制,而固定第一和第三步都被es自己实现,对使用者来说显得非常精简,而整个过程并无特殊之处

56630

sofa-ark隔离技术分析调研

需要注意是,如果仅仅是在IDE运行代码,是完全感知不到打包逻辑,因为IDE自动帮你下载Jar包、指定classPath。...但是我们又不能将这些依赖全部排除掉,毕竟这里面还有业务方真正用到那些。 这显然不是我们期望看到局面,虽然在运行时是隔离,但是在编译期,那些间接依赖还是充斥业务开发人员IDE。...这样做好处就是,即使业务在使用时exclude了Ark Plugin包所有依赖,业务在编译期仍然能正常使用那些shade进来。...在IDE启动,由于静态代码块是会在容器启动之前就会加载一次。...容器启动是在启动完成、而不是,因此静态代码块就会正常只被执行一次,这样就不会有问题了。

1.6K30

《Effective Java》读书笔记(一)之创建和销毁对象

第1条 考虑用静态工厂方法代替构造器 一般来说,获取一个实例,大家想到都是通过该类公有构造函数来new 一个实例,而第一条推荐我们可以考虑使用静态工厂方法来创建实例,这里工厂方法并不直接对应于设计模式工厂方法模式...静态工厂方法与构造器不同第二大优势在于:不必再每次调用它们时候都创建一个新对象 如果一个是不可变,那在获取它实例,就不必每次都通过构造方法去new,而是通过静态工厂方法将之前已经创建好,...典型就是Collections几乎都是通过静态工厂方法在一个不可实例化中导出。 静态工厂方法返回对象所属,在编写包含该静态工厂方法可以不必存在,这种灵活方式构成了服务提供者框架。...getType 和getInstance功能类似,在工厂方法处于不同时候使用,Type表示工厂方法所返回对象类型 newType 和newInstance功能类似,在工厂方法处于不同时候使用...在C++,析构器是回收一个对象所占用资源常规方法,是析构器所必需对应物。 在java,当一个对象变得不可到达时候,垃圾回收器回收与该对象相关联存储空间,并不需要程序员做专门工作

34330

SpringBoot - 探究Spring Boot应用是如何通过java -jar 启动

使用-jar参数,后面的参数是的jar 【spring-0.0.1-SNAPSHOT.jar】,该jar文件包含是class和资源文件; 在manifest文件中有Main-Class定义;Main-Class...JarFile被构造时候解析内部结构,去获取jar包里各个文件或文件夹,这些文件或文件夹会被封装到Entry,也存储在JarFileArchive。...JarLauncher并调用父Launcherlaunch方法启动程序。...(2)以第一步构建ClassLoader加载MANIFEST.MF文件Start-Class指向业务,并且执行静态方法main。进而启动整个程序。...至此,才执行我们应用程序入口main方法,所有应用程序文件均可通过/BOOT-INF/classes加载,所有依赖第三方jar均可通过/BOOT-INF/lib加载。 ?

1.3K30

Eclipse将引用了第三方jarJava项目打包成jar文件两种方法

,文件里打包为package com.main; 那么这里就写com.main.KillCheatFans, 不要加.java后缀,主文件地址写错将会出现“找不到或无法加载错误; 4、写完Main-Class...后一定要回车(即最后一行是空白行),让光标到下一行,这样你生成jar包才能找到你class去运行, 否则将会出现“jar没有主清单属性”错误。...方案二:安装Eclipse打包插件Fat Jar 方案一对于含有较多第三方jar文件或含有第三方图片资源等就显得不合适,太繁琐。这时可以使用一个打包插件—Fat Jar。...自带打包jar似乎不太够用,Fat Jar是eclipse一个插件,特别是Fat Jar可以打成可执行Jar包,并且在图片等其他资源、引用外包方面使用起来更方便。...使用方法: 步骤1:右击工程项目选择Buile Fat Jar ? ? 步骤2:配置jar文件存放目录,Main文件等,如下图 ? ? 步骤3:选择所要用到第三方jar包 ? ?

1.7K20

快速构建第一个Flink工程

main 方法是程序入口,既可用于IDE测试/执行,也可用于部署。 我们建议你将 此项目导入IDE 来开发和测试它。 IntelliJ IDEA 支持 Maven 项目开箱即用。...注意: 如果你使用其他而不是 StreamingJob 作为应用程序/入口,我们建议你相应地修改 pom.xml 文件 mainClass 配置。...这样,Flink 可以从 JAR 文件运行应用程序,而无需另外指定。 Gradle 环境要求 唯一要求是使用 Gradle 3.x (或更高版本) 和安装 Java 8.x 。...main 方法是程序入口,即可用于IDE测试/执行,也可用于部署。 我们建议你将 此项目导入你 IDE 来开发和测试它。...注意: 如果你使用其他而不是 StreamingJob 作为应用程序/入口,我们建议你相应地修改 build.gradle 文件 mainClassName 配置。

1.9K31

Fat jar打包工具

,但是eclipse自带jar似乎不太够用,Fat Jar是eclipse一个插件,特别是Fat Jar可以打成可执行Jar包,并且在图片等其他资源、引用外包方面使用起来更方便。...Jar被认不出来,在eclipse启动使用-clean参数 eclipse  -clean  & 方法1 项目右键 ——》 Export.. ——》 Others ——》Fat Jar Exporter...使用问题:刚使用Fat Jar打包了一个SWT程序,头两次打包成功后运行打包jar文件,但是提示找不到,但是在打包是我已经配置过,看打好META-INF\MANIFEST.MF前两行的确没有关于定义...,手动加上配置之后jar包就可以双击启动了,很费解,就去Fat Jar项目主页(http://fjep.sourceforge.net)去看了下,在Fat Jar Eclipse Plug-In...选项,应该使用默认,这样就没问题了 方法2 右键项目 ——》 Build Fat Jar,如下图: ?

1.7K30

快速构建第一个Flink工程

main 方法是程序入口,既可用于IDE测试/执行,也可用于部署。 我们建议你将 此项目导入IDE 来开发和测试它。 IntelliJ IDEA 支持 Maven 项目开箱即用。...注意: 如果你使用其他而不是 StreamingJob 作为应用程序/入口,我们建议你相应地修改 pom.xml 文件 mainClass 配置。...这样,Flink 可以从 JAR 文件运行应用程序,而无需另外指定。 Gradle 环境要求 唯一要求是使用 Gradle 3.x (或更高版本) 和安装 Java 8.x 。...main 方法是程序入口,即可用于IDE测试/执行,也可用于部署。 我们建议你将 此项目导入你 IDE 来开发和测试它。...注意: 如果你使用其他而不是 StreamingJob 作为应用程序/入口,我们建议你相应地修改 build.gradle 文件 mainClassName配置。

1.7K30

ssm总结

,spring先去一级缓存里面取/二/,如果都没有的话呢,创建一个工厂对象,从工厂对象去实例化bean,当我们属性注入过后呢,spring会把他放到二级缓存,然后马上执行初始化方法,初始化过后方法呢...判断请求后缀是否满足格式要求,如果满足格式要求,查询handlerMapping,查找对应handler,调用handlerAdapter进行参数绑定适配工作,之后调用具体handler处理业务逻辑...当我们使用JDBC来执行sql,一般先预处理sql,也就是conn.prepareStatement(sql),获取返回PreparedStatement对象(实现了Statement接口),再调用...jar包含jar),包含了应用里来jar包和spring boot loader相关 java -jar 时候 会去jar包找manifest文件,在哪里找到真正启动 fat jar启动...工厂,加载自动配置(启动应用服务器) 该自动配置,通过conditionalOnClass判断使用哪一个web容器(默认tomcat 在内嵌tomcat配置了一个web容器工厂 它会在springboot

34910

Spring Boot -- 如何获取已加载JAR文件流

对于已加载,可以通过其对应ClassgetProtectionDomain()方法获取到对应文件信息,以获取commons-lang3jar包为例,如清单1所示。...本地IDE运行 在IDEA中直接运行返回如下所示,很明显IDEA在运行时会把maven仓库对应jar路径放入classpath下,运行起来后加载器自动寻找对应jar,所以定位到了具体maven...jar位置,使用方法与上文介绍一致。...// 获取失败使用JDK自带方式获取,作为备份方案 return openFallbackConnection(url, ex); } } 由上述逻辑可以发现,当URL为jar:file:...Handler实现openConnection方法,因此当在项目代码想要读取jar in jar格式架包,则可以用该Handler进行资源读取。

5.4K10

《Effective Java 》系列一

如果类构造器或者静态工厂具有多个参数,设计这种类,Builder模式就始终不错选择。...5 避免创建不必要对象 对于同时提供了静态工厂方法(1)和构造器不可变,通常可以使用静态工厂方法而不是构造器,以避免不必要对象。...新每个实例方法都可以被调用被包含已有实例对应方法,并返回它结果。这被称为转发,新方法被称为转发方法。这样非常稳固,他不依赖于已有事现细节。...1声明为final 2把所有的构造函数变成私有的,并增加一些公有静态工厂来代替构造函数 消除一个可改写方法而不改变它行为,做法如下 把每个可改写方法代码移到一个私有的辅助方法,并让每个可改写方法...安全发布对象引用有许多种方法: 可以将它保存在静态域中,作为初始化一部分; 可以将它保存在volatile域、final域或者通过正常锁定访问域中;或者可以将它放到并发集合

80440

Java 加载器解析及常见加载问题

Java 懒惰特性影响了加载器工作方式——所有事情都应该在最后一刻完成。只有在以某种方式被引用时才会被加载-通过调用构造函数、静态方法或字段。...在某些应用程序容器,遵循此建议,但在其他应用程序容器,web 模块加载器配置为遵循与其他加载器相同委托模型,因此建议参考您使用应用程序容器文档。...这意味着,在编译当前执行,搜索到定义存在,但在运行时找不到该定义。 这就是为什么你不能总是依赖你 IDE 告诉你一切正常,代码编译应该正常工作。...可能,我们在 demo-lib.jar 打包了 Util 初始版本,但是在添加了新 sayHello 方法之后,我们没有重新构建这个包。...我们将以使用工厂修改初始示例,以便提供提供问候消息实现。这看起来很做作,但这是很常见模式。

87230
领券