首页
学习
活动
专区
工具
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 模式是一个不错的选择,特别是如果许多参数是可选的或相同类型的。

97730

Effective Java 2.0_Item 2_中文版

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

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

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

    65110

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

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

    51530

    Effective Java 2.0_中英文对照_Item 2

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

    33720

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

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

    47020

    Effective Java(一)

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

    66910

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

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

    65330

    sofa-ark类隔离技术分析调研

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

    1.8K31

    SpringBoot从0到实战5:项目是如何通过jar包启动的?

    使用百度翻译如下: 使用-jar参数时,后面的参数是jar的文件名称(本例子中是spring-boot-hello-0.0.1-SNAPSHOT.jar),该jar文件中包含的是class和资源文件;在...简单的理解为:java -jar会找jar中的mainfest文件,进而找到属性Main-Class文件,从而找到真正的启动类。...1)加载jar中的jar文件以及class文件; (2)启动main方法; 对于main方法启动类上的注解@SpringBootApplication注解是在相应的jar中的,很显然不能直接先启动...main方法中的类,然后再加载jar文件。...所以需要Main-Class就不能指向main方法中的启动类了,对于SpringBoot定义了一个JarLauncher来加载jar文件和class文件,对于jar文件和class文件的加载的工作在java

    15910

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

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

    36530

    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并调用父类Launcher中的launch方法启动程序。...(2)以第一步构建的ClassLoader加载MANIFEST.MF文件中Start-Class指向的业务类,并且执行静态方法main。进而启动整个程序。...至此,才执行我们应用程序主入口类的main方法,所有应用程序类文件均可通过/BOOT-INF/classes加载,所有依赖的第三方jar均可通过/BOOT-INF/lib加载。 ?

    1.5K30

    快速构建第一个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

    Eclipse将引用了第三方jar包的Java项目打包成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包 ? ?

    3.3K20

    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

    37710

    快速构建第一个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

    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

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

    对于已加载的类,可以通过其对应的Class类的getProtectionDomain()方法获取到对应的文件信息,以获取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.6K10

    《Effective Java 》系列一

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

    85040
    领券