策略信I:Ben and Jerry's vs. Amazon

本文探讨了两种创业模型:BenandJerry's模型与Amazon模型。BenandJerry's模型适用于已有竞争者的市场,强调逐步增长和盈利能力;Amazon模型则适用于新兴市场,侧重快速扩张和用户积累,即使初期亏损。

Joel on Software

策略信IBen and Jerry's vs. Amazon

by Joel Spolsky

Friday, May 12, 2000

原文连接 http://joelonsoftware.com/articles/fog0000000056.html

创办一家公司?你做了一个非常重要的决定,因为这关系到你其它所有的事情。不管你做什么,你决定要选定你所在的阵营,并且相应的准备好所有的事情,否则在你身上将会发生一场大灾难。

决定?这个决定是逐渐形成,有组织的,可盈利的,还是这个决定是突然产生的,并且具有充足的资金。

有一种组织模式,它创办时候很小,只有有限的目标,需要长时间建立商业关系。我把这种模式叫做Ben and Jerry's模型,因为Ben and Jerry's很好的符合这种模式。

还有一种模式,叫做"快速成长型"(也叫做"陆上霸王"),需要你投入大量资金,尽可能快的膨胀而不考虑这时期的盈利状况。我把这种模式叫做Amazon模型,因为Amazon的创始人Jeff Bezos 几乎就是"快速成长型企业"的实际代言人了。

我们来看下这两种模型的不同点。第一个需要面临的问题就是:你创办公司进入的行业是否存在竞争?

Ben and Jerry's Amazon

大量已经存在的竞争者 新技术,一开始不存在竞争者

如果你没有任何真正的竞争者,就像Amazon,你就有机会能成为"陆上霸王",因为你能尽可能快的吸引客户,因此当迟来的竞争者进入这行业的时候就有障碍。但是,如果你进入的行业已经有其它企业立足,那么成为"陆上霸王"的想法就不太能行得通。你创造的客户是来自你的竞争者的,你需要把他们吸引过来。

一般来说,风险投资商对要进入已经存在竞争者的行业的想法并没有非常大的热情。就我个人来说,我并不害怕竞争者;也许是因为我以前在微软Excel部门工作,在那个时期Excel几乎完全替代了Lotus123,它之前几乎拥有全部的市场。排名第一的文字处理器,Word替换了WordPerfect,它之前替换了WordStar,每个后来者都几乎替换前者成为了市场垄断者。然而,Ben and Jerry's 成长了并建立了神话般的业务,即使在它之前并不是不可能买到冰激凌。如果你只想替换掉竞争者,你就不可能做到。(我会在以后的策略信中提到)。

取代竞争者的另外一个问题是你的业务是否具有网络效应和用户粘性

Ben and Jerry's Amazon

没有网络效应,用户粘性弱 网络效应强,用户粘性强

"网络效应"是这样一种情况,当你的用户越多,你将来增长的客户也越多。基于Metcalfe定律:网络的价值等于用户数量的平方。

一个绝佳的例子就是eBay。如果你想要出售自己旧的Petek Philippe 手表,放到eBay上你会有更高的价格,因为那里的买家更多。如果你想要卖Patek Philippe手表,你将会去Bay,因为那里的卖家更多。

另外一个有强大的网络效应的例子是专有聊天系统,像ICQ或者AOL Instant Messenger。如果你要和别人聊天,你必须使用对方使用的工具,而ICQ和AOL是目前使用人数最多的。很有可能,你的朋友是使用这两者之一,而不是其它厂商的工具,像MSN。即使像微软这样有如此充足的资金,有强有力的公关技巧,也不能占据即时消息的主流市场,因为它的网络效应太强大了。

"用户粘性"就是业务中的某种东西使用户不愿意更换提供商。没有人想要更换网络提供商,即使它的服务不是非常好,因为你可能需要更换email地址,你要通知所有人你新的email地址。人们也不愿意更换文字处理器因为他们以前的文件不能被新的文字处理器读取。

还有一种比用户粘性更强大,且卑鄙的版本,我把它叫做隐形用户粘性:一种服务在你根本感觉不到的情况下粘住你。比如说,有一种新的服务像 PayMyBills.com,它为你接收你的账单,扫描进电脑,使你可以上网查看你的账单。他们通常一开始有三个月的免费服务。但是当你三个月过后,如果你不想继续下去,你别无选择只能去联系每个账单提供商让他们把账单地址改成你自己的房子。这种突如其来的事情就好像为了防止你停止使用PayMyBills.com-你只能让他们每个月从你的银行账户上吞掉8.95美元。

如果你进入的行业自然的拥有网络效应和用户粘性,并且没有竞争者,那么你最好使用Amazon模型,不然其他人会使用这个模型,你失去立足点了。

来个快速案例学习。在1998年,AOL通过消耗大量的钱使它每五个星期增加一百万用户。AOL有聊天室和即时聊天工具,这些提供了强大的用户粘性。一旦你在这里找到了一群可以聊天的朋友,你就不想要更换提供商了。因为更换提供商就相当于要去重新找新朋友。在我看来,这就是为什么AOL可以在还有大量提供商每个月只收费10美元的情况下而每个月收费22美元。

当我还在Juno工作的时候,管理人员就是不理解这一点,当所有人都开始冲向网络而AOL还在申请注册的这个间隙里,Juno失去了这个千载难逢的机会:他们并不能足够的满足客户需求,因为他们不想为了更多的资金而稀释现有的股东,而且他们没有用战略性的眼观看待聊天和IM,因此他们永远不能开发出一套能像AOL那样具有强大的用户粘性的软件。现在,Juno拥有三百万左右的用户平均每月支付5.50美元,而AOL拥有两千一百万左右的用户平均每月支付17美元。

Ben and Jerry's Amazon

资金需求少; 盈利快;


需要大量的资金; 盈利需要多年时间;

Ben and Jerry's 公司开始于某人的信用卡。在他们的前几个月和前几年,他们必须使用能快速盈利的商业模式,这模式可能不是他们想达到的最终的商业模式。比如说,你想要成为一个拥有年销售额200,000,000美元的大型的冰激淋公司,但是目前你只能在Vermont开一家小的冰激凌店铺,期望能赚一点钱,如果真的赚钱了,在用获得的利润稳定的开拓业务。Ben and Jerry's 的简介里说他们创业资金有12000美元。ArsDigita说他们的创业资金是11000美元。这些数字听起来真像MasterCard的信贷额度。你说呢?

Amazon公司集资钱的速度比任何人花钱的速度都快。原因是这样的。他们在赶时间。如果他们的业务没有竞争者并且具有网络效应,那么他们最好能快速成长。分秒必争。而且有很多种方式可以用钱替换时间。下面的每一条都很有趣。

用钱替换时间的方式:

  • 使用已经建好,并且配备办公用品的办公室替代传统的办公室。花费:大约是正常的三倍。节约的时间:几个月至一年,取决于市场。
  • 为创业骨干支付巨额薪水,或给赠送程序员一辆BMW。花费:为技术员工额外花费25%的费用。节约的时间:可以在3个星期内发布而不是正常的6个月。
  • 委托咨询公司而不是雇佣员工。花费:大约三倍。节约的时间:可以直接咨询顾问,立即行动。
    顾问没有对你的事情花足够的时间或保持足够的注意力?直接用钱贿赂他们直到他们能为你尽心尽力。
  • 对遇到的问题直接用钱解决。如果你的程序员由于他忙于装修房子,搬家而不能做足够多的工作,雇佣高级搬迁装修服务为他工作。如果你新的办公司电话久久不能安装,就去购买大量的手机。网络连接问题降低工作效率?直接找两家网络服务提供商。为所有的员工提供门房,为他们拿干洗的衣服,预定飞机,准备去机场的豪华轿车,等等。

Ben and Jerry's 公司付不起这些东西,因此他们只能慢慢成长。

Ben and Jerry's Amazon


企业文化至关重要。 不可能有企业文化。

当你以每年100%的速度成长,导师根本就不可能把企业价值观念传递给新员工。如果一个程序员晋升为经理,并且突然有5个手下,而且他们昨天刚刚招募进来,根本就不可能有很多的训练。对于这一点,Netscape就是一个例子,在一年里从一开始的5名程序员发展到2000名程序员。结果,他们的企业文化就是由不同的人不同的价值观组成的混合物,每种价值观都会把公司指向不同的方向。

对于有一些公司,不用担心这一点。对于另外一些公司,公司文化对于公司本身就是一个重要的组成部分。Ben and Jerry's 生存到现在是因为创始人没有让公司的发展速度超过他价值观的传播速度。

我们假象一个软件作为例子。假设你想要闯入文字处理器的市场。现在这个市场看上去被微软垄断,但是你还是看到一小块生存空间,由于一些原因文字处理器总是会崩溃。你将会做一个超级健壮,超级强度的文字处理器,这款软件永远不会崩溃,并且以高价卖给那些文字为生的人。(这款软件超级健壮。我说过这只是一个假想的例子)。

你的公司文化中可能包括各种能写出高鲁棒性代码的技术:单元测试,正式的code review, code conventions, 并且有很大的QA部门,等等。这些技术并不是微不足道;它们都需要比较长一段时间的学习。当一个新的程序员学习如何写出高鲁棒性代码的时候,他们需要具有丰富经验的前辈指导。

当你发展壮大的速度使这种辅导变得不可能的时候,你会停止传输这些价值观。新雇员会开始写出不可靠的代码。他们将不会检查malloc()的返回值,他们的代码会在他们永远想不到的地方崩溃,而且没有人有时间检查他们的代码和知道他们正确的方式,你对于Microsoft Word所有的竞争优势都被糟蹋了。

Ben and Jerry's Amazon

错误成了难得的经验教训。 错误不会真正被重视。

成长如此快速的公司不会注意到错误知道出现一个重量级的错误,特别是那些花费太多资金之类的错误。Amazon收购了Junglee,购买了大约一千八百万的股权,然后突然意识到购物比较服务对他们的业务来说并不是非常适合,因此他们关掉了这个公司。使用了大把大把的钞票使这个愚蠢的错误非常容易的解决了。

Ben and Jerry's Amazon


扩张需要很长的时间 成长迅速。

快速成长给人的印象就是成功。如果准雇员看到你在一星期内要雇佣30位新员工,他们会觉得他们他们是公司大事件(像上市)的一分子,感到幸福和成就感。

根据经验,你可以有一个优越的工作环境,或者有承诺人们他们会很快变得富有。你至少要做到一点,否则你将不会雇到人。

你的一些员工会对有很高的上市机会和大量的股票期权的公司印象深刻。这些人会愿意像这样待在一个公司三年或者四年,即使他们讨厌工作的每一天,因为他们看到了大雨之后出现的彩虹。

如果你成长缓慢,那么希望就失去作用了。在这种情况下,你必须使得工作环境变得变得像是旅程的奖励。绝对不是那种一个星期工作80小时的制度。办公室不能是一个巨大的吵闹的阁楼,放满简易桌子和硬木头椅子。你必须给员工像样的度假。人们应该能和同事成为朋友而不仅仅是同事。工作时候的交际非常重要。管理者应该开明,不应该监视着员工。如果你做到了所有的这些,你将会吸引足够的人,他们已经被在下次上市成为百万富翁的希望愚弄了太多次了;现在他们只想找一个地方能可持续发展。

Ben and Jerry's

你可能会成功。

你肯定不会失去太多的金钱。

Amazon

你有极其微小的机会成为

亿万富翁,而有很高的机会失败。

使用Ben and Jerry's 的商业模式,只要你有一定的能力,你就能成功。可能会有一些艰苦的奋斗,可能会有赚钱的时候也有赔钱的时候,但是除非你遇到了经济大萧条,你肯定不会损失太多的钱,因为你在一开始并没有投入太多的钱。

Amazon的商业模型困境在于,对于这个模型任何人想到的只有Amazon。而且只有一个Amazon。你应该想到还有其他95%的公司消耗了巨大的风险资金后失败了,因为没有人愿意购买他们的产品。至少,如果你按照Ben and Jerry's 的商业模型,你会在花费一张MasterCard卡的信贷额度之前发现没有人愿意购买你的产品。

你能做的糟糕的事情

你做的最差的事情是不能决定采用Ben and Jerry's 公司还是Amazon公司的模型。

如果你要进入的市场还不存在竞争者,并且有网络效应和用户粘性,你最好使用Amazon模型,否则就走上Wordsworth.com的道路,他们比Amazon早成立两年,但是没有人听说过他们。还有一种更糟糕的,成为一个鬼站,像MSNAuctions,他从来都没有机会超越ebay。

如果你要进入的市场已经成熟,那么想要快速成长将是浪费钱的一种非常好的方式,就像BarnesandNoble.com做的那样。你的希望应该是放在可持续性发展和实现盈利,因此你可以有很长的时间慢慢挤掉对手。

还不能决定吗?还有其他事情可以放进去考虑。还可以考虑一下你的个人价值观。你想要有一个Amazon那样的公司还是Ben and Jerry's 的公司?你可以看一些公司的历史-Amazon and Ben and Jerry's for starters,虽然里面有一些虚构,但还是可以哪种模式更符合你的价值观。实际上,有一个公司更加符合Ben and Jerry's公司的模型,那就是微软,而且你可以找到很多关于微软历史的资料。微软可以说很"幸运"'的达成了PC-DOS的协议,但是它是能盈利并且一直不停的成长,因此他们可以有无穷多的时间等待一次重大的突破。

考虑一下你的风险回报比。你想要在35岁时候短时间内成为亿万富翁,即使看上去你像是在做类似博彩的事情吗?那么Ben and Jerry's 公司的商业模型讲不适合你。

你能做的一个最差的决定就是你要像Amazon那样却表现的像Ben and Jerry's公司一样(而且你一直在否认)。Amazon类型的公司必须要用资金换时间。你可能会认为你很聪明和节约,因为你坚持找一些廉价的二流的程序员。但是,你又是不聪明的,因为你将花费六个月而不是一般的两个月时间做出产品,而且那多出来的四个月可能意味着你会错过圣诞节这样的购物节,因此你的损失是一年,而且这么长的时间里还不一定能正常运营。你可能认为你决定为你的软件软件同时做出一个Mac版本和Windows版本很有战略意识,但是如果这花费你的程序员两倍的时间在考虑兼容性上,但是只增加15%的用户,那么你看上去就不那么具有战略性了,你说呢?

这两种模型现实中都存在,但是你只能选择一种并且要严格遵守,否则你会发现公司业务莫名其妙的出现问题,并且你不会很清楚的知道为什么。

Build file 'E:\ben\MusicPlayer\build.gradle.kts' line: 10 Plugin [id: 'com.android.application', version: '8.5.0', artifact: 'com.android.tools.build:gradle:8.5.0', apply: false] was not found in any of the following sources: - Gradle Core Plugins (plugin is not in 'org.gradle' namespace) - Included Builds (No included builds contain this plugin) - Plugin Repositories (could not resolve plugin artifact 'com.android.tools.build:gradle:8.5.0') Searched in the following repositories: Google(https://maven.google.com/) Gradle Central Plugin Repository MavenRepo maven(https://maven.aliyun.com/repository/public) maven2(https://maven.aliyun.com/repository/google) * Try: > Run with --info or --debug option to get more log output. > Run with --scan to get full insights. > Get more help at https://help.gradle.org. * Exception is: org.gradle.api.plugins.UnknownPluginException: Plugin [id: 'com.android.application', version: '8.5.0', artifact: 'com.android.tools.build:gradle:8.5.0', apply: false] was not found in any of the following sources: - Gradle Core Plugins (plugin is not in 'org.gradle' namespace) - Included Builds (No included builds contain this plugin) - Plugin Repositories (could not resolve plugin artifact 'com.android.tools.build:gradle:8.5.0') Searched in the following repositories: Google(https://maven.google.com/) Gradle Central Plugin Repository MavenRepo maven(https://maven.aliyun.com/repository/public) maven2(https://maven.aliyun.com/repository/google) at org.gradle.plugin.use.resolve.internal.PluginResolutionResult.getFound(PluginResolutionResult.java:112) at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.resolvePluginRequest(DefaultPluginRequestApplicator.java:197) at org.gradle.plugin.use.internal.DefaultPluginRequestApplicator.applyPlugins(DefaultPluginRequestApplicator.java:101) at org.gradle.kotlin.dsl.provider.PluginRequestsHandler.handle(PluginRequestsHandler.kt:45) at org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator$InterpreterHost.applyPluginsTo(KotlinScriptEvaluator.kt:242) at org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost.applyPluginsTo(Interpreter.kt:387) at Program.execute(Unknown Source) at org.gradle.kotlin.dsl.execution.Interpreter$ProgramHost.eval(Interpreter.kt:516) at org.gradle.kotlin.dsl.execution.Interpreter.eval(Interpreter.kt:214) at org.gradle.kotlin.dsl.provider.StandardKotlinScriptEvaluator.evaluate(KotlinScriptEvaluator.kt:133) at org.gradle.kotlin.dsl.provider.KotlinScriptPluginFactory$create$1.invoke(KotlinScriptPluginFactory.kt:61) at org.gradle.kotlin.dsl.provider.KotlinScriptPluginFactory$create$1.invoke(KotlinScriptPluginFactory.kt:52) at org.gradle.kotlin.dsl.provider.KotlinScriptPlugin.apply(KotlinScriptPlugin.kt:35) at org.gradle.configuration.BuildOperationScriptPlugin$1.run(BuildOperationScriptPlugin.java:68) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) at org.gradle.configuration.BuildOperationScriptPlugin.lambda$apply$0(BuildOperationScriptPlugin.java:65) at org.gradle.internal.code.DefaultUserCodeApplicationContext.apply(DefaultUserCodeApplicationContext.java:44) at org.gradle.configuration.BuildOperationScriptPlugin.apply(BuildOperationScriptPlugin.java:65) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$1(DefaultProjectStateRegistry.java:435) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:453) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:434) at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:46) at org.gradle.configuration.project.BuildScriptProcessor.execute(BuildScriptProcessor.java:27) at org.gradle.configuration.project.ConfigureActionsProjectEvaluator.evaluate(ConfigureActionsProjectEvaluator.java:35) at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.lambda$run$0(LifecycleProjectEvaluator.java:109) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$applyToMutableState$1(DefaultProjectStateRegistry.java:435) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.lambda$fromMutableState$2(DefaultProjectStateRegistry.java:458) at org.gradle.internal.work.DefaultWorkerLeaseService.withReplacedLocks(DefaultWorkerLeaseService.java:359) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.fromMutableState(DefaultProjectStateRegistry.java:458) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.applyToMutableState(DefaultProjectStateRegistry.java:434) at org.gradle.configuration.project.LifecycleProjectEvaluator$EvaluateProject.run(LifecycleProjectEvaluator.java:100) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) at org.gradle.configuration.project.LifecycleProjectEvaluator.evaluate(LifecycleProjectEvaluator.java:72) at org.gradle.api.internal.project.DefaultProject.evaluateUnchecked(DefaultProject.java:828) at org.gradle.api.internal.project.ProjectLifecycleController.lambda$ensureSelfConfigured$2(ProjectLifecycleController.java:89) at org.gradle.internal.model.StateTransitionController.lambda$doTransition$14(StateTransitionController.java:255) at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:254) at org.gradle.internal.model.StateTransitionController.lambda$maybeTransitionIfNotCurrentlyTransitioning$10(StateTransitionController.java:199) at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:36) at org.gradle.internal.model.StateTransitionController.maybeTransitionIfNotCurrentlyTransitioning(StateTransitionController.java:195) at org.gradle.api.internal.project.ProjectLifecycleController.ensureSelfConfigured(ProjectLifecycleController.java:89) at org.gradle.api.internal.project.DefaultProjectStateRegistry$ProjectStateImpl.ensureConfigured(DefaultProjectStateRegistry.java:400) at org.gradle.execution.TaskPathProjectEvaluator.configure(TaskPathProjectEvaluator.java:70) at org.gradle.execution.TaskPathProjectEvaluator.configureHierarchy(TaskPathProjectEvaluator.java:84) at org.gradle.configuration.DefaultProjectsPreparer.prepareProjects(DefaultProjectsPreparer.java:50) at org.gradle.configuration.BuildTreePreparingProjectsPreparer.prepareProjects(BuildTreePreparingProjectsPreparer.java:65) at org.gradle.configuration.BuildOperationFiringProjectsPreparer$ConfigureBuild.run(BuildOperationFiringProjectsPreparer.java:52) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:30) at org.gradle.internal.operations.DefaultBuildOperationRunner$1.execute(DefaultBuildOperationRunner.java:27) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) at org.gradle.internal.operations.DefaultBuildOperationRunner.run(DefaultBuildOperationRunner.java:48) at org.gradle.configuration.BuildOperationFiringProjectsPreparer.prepareProjects(BuildOperationFiringProjectsPreparer.java:40) at org.gradle.initialization.VintageBuildModelController.lambda$prepareProjects$2(VintageBuildModelController.java:84) at org.gradle.internal.model.StateTransitionController.lambda$doTransition$14(StateTransitionController.java:255) at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:254) at org.gradle.internal.model.StateTransitionController.lambda$transitionIfNotPreviously$11(StateTransitionController.java:213) at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:36) at org.gradle.internal.model.StateTransitionController.transitionIfNotPreviously(StateTransitionController.java:209) at org.gradle.initialization.VintageBuildModelController.prepareProjects(VintageBuildModelController.java:84) at org.gradle.initialization.VintageBuildModelController.getConfiguredModel(VintageBuildModelController.java:64) at org.gradle.internal.build.DefaultBuildLifecycleController.lambda$withProjectsConfigured$1(DefaultBuildLifecycleController.java:133) at org.gradle.internal.model.StateTransitionController.lambda$notInState$3(StateTransitionController.java:132) at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:46) at org.gradle.internal.model.StateTransitionController.notInState(StateTransitionController.java:128) at org.gradle.internal.build.DefaultBuildLifecycleController.withProjectsConfigured(DefaultBuildLifecycleController.java:133) at org.gradle.internal.build.DefaultBuildToolingModelController.locateBuilderForTarget(DefaultBuildToolingModelController.java:58) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.lambda$locateBuilderForBuildTarget$0(DefaultBuildTreeModelCreator.java:136) at org.gradle.internal.build.DefaultBuildLifecycleController.withToolingModels(DefaultBuildLifecycleController.java:327) at org.gradle.internal.build.AbstractBuildState.withToolingModels(AbstractBuildState.java:160) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.locateBuilderForBuildTarget(DefaultBuildTreeModelCreator.java:136) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.locateBuilderForDefaultTarget(DefaultBuildTreeModelCreator.java:121) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.locateBuilderForTarget(DefaultBuildTreeModelCreator.java:110) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.access$200(DefaultBuildTreeModelCreator.java:70) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController$1.call(DefaultBuildTreeModelCreator.java:85) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator$DefaultBuildTreeModelController.getModel(DefaultBuildTreeModelCreator.java:81) at org.gradle.tooling.internal.provider.runner.DefaultBuildController.getModel(DefaultBuildController.java:104) at org.gradle.tooling.internal.consumer.connection.ParameterAwareBuildControllerAdapter.getModel(ParameterAwareBuildControllerAdapter.java:40) at org.gradle.tooling.internal.consumer.connection.UnparameterizedBuildController.getModel(UnparameterizedBuildController.java:116) at org.gradle.tooling.internal.consumer.connection.NestedActionAwareBuildControllerAdapter.getModel(NestedActionAwareBuildControllerAdapter.java:32) at org.gradle.tooling.internal.consumer.connection.UnparameterizedBuildController.getModel(UnparameterizedBuildController.java:79) at org.gradle.tooling.internal.consumer.connection.NestedActionAwareBuildControllerAdapter.getModel(NestedActionAwareBuildControllerAdapter.java:32) at org.gradle.tooling.internal.consumer.connection.UnparameterizedBuildController.getModel(UnparameterizedBuildController.java:64) at org.gradle.tooling.internal.consumer.connection.NestedActionAwareBuildControllerAdapter.getModel(NestedActionAwareBuildControllerAdapter.java:32) at com.intellij.gradle.toolingExtension.impl.modelSerialization.ToolingSerializerConverter.lambda$new$0(ToolingSerializerConverter.java:24) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:55) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:31) at com.intellij.gradle.toolingExtension.impl.modelSerialization.ToolingSerializerConverter.<init>(ToolingSerializerConverter.java:23) at com.intellij.gradle.toolingExtension.impl.modelAction.GradleModelFetchAction.lambda$initAction$9(GradleModelFetchAction.java:171) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:55) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:31) at com.intellij.gradle.toolingExtension.impl.modelAction.GradleModelFetchAction.initAction(GradleModelFetchAction.java:170) at com.intellij.gradle.toolingExtension.impl.modelAction.GradleModelFetchAction.lambda$doExecute$4(GradleModelFetchAction.java:118) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:55) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:31) at com.intellij.gradle.toolingExtension.impl.modelAction.GradleModelFetchAction.doExecute(GradleModelFetchAction.java:117) at com.intellij.gradle.toolingExtension.impl.modelAction.GradleModelFetchAction.lambda$execute$1(GradleModelFetchAction.java:103) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:55) at com.intellij.gradle.toolingExtension.impl.telemetry.GradleOpenTelemetry.callWithSpan(GradleOpenTelemetry.java:31) at com.intellij.gradle.toolingExtension.impl.modelAction.GradleModelFetchAction.lambda$execute$2(GradleModelFetchAction.java:102) at com.intellij.gradle.toolingExtension.impl.modelAction.GradleModelFetchAction.withOpenTelemetry(GradleModelFetchAction.java:297) at com.intellij.gradle.toolingExtension.impl.modelAction.GradleModelFetchAction.lambda$execute$3(GradleModelFetchAction.java:101) at com.intellij.gradle.toolingExtension.impl.util.GradleExecutorServiceUtil.withSingleThreadExecutor(GradleExecutorServiceUtil.java:18) at com.intellij.gradle.toolingExtension.impl.modelAction.GradleModelFetchAction.execute(GradleModelFetchAction.java:100) at com.intellij.gradle.toolingExtension.impl.modelAction.GradleModelFetchAction.execute(GradleModelFetchAction.java:33) at org.gradle.tooling.internal.consumer.connection.InternalBuildActionAdapter.execute(InternalBuildActionAdapter.java:65) at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner$ActionAdapter.executeAction(AbstractClientProvidedBuildActionRunner.java:109) at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner$ActionAdapter.runAction(AbstractClientProvidedBuildActionRunner.java:97) at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner$ActionAdapter.beforeTasks(AbstractClientProvidedBuildActionRunner.java:81) at org.gradle.internal.buildtree.DefaultBuildTreeModelCreator.beforeTasks(DefaultBuildTreeModelCreator.java:62) at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$fromBuildModel$2(DefaultBuildTreeLifecycleController.java:83) at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.lambda$runBuild$4(DefaultBuildTreeLifecycleController.java:120) at org.gradle.internal.model.StateTransitionController.lambda$transition$6(StateTransitionController.java:169) at org.gradle.internal.model.StateTransitionController.doTransition(StateTransitionController.java:266) at org.gradle.internal.model.StateTransitionController.lambda$transition$7(StateTransitionController.java:169) at org.gradle.internal.work.DefaultSynchronizer.withLock(DefaultSynchronizer.java:46) at org.gradle.internal.model.StateTransitionController.transition(StateTransitionController.java:169) at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.runBuild(DefaultBuildTreeLifecycleController.java:117) at org.gradle.internal.buildtree.DefaultBuildTreeLifecycleController.fromBuildModel(DefaultBuildTreeLifecycleController.java:82) at org.gradle.tooling.internal.provider.runner.AbstractClientProvidedBuildActionRunner.runClientAction(AbstractClientProvidedBuildActionRunner.java:43) at org.gradle.tooling.internal.provider.runner.ClientProvidedPhasedActionRunner.run(ClientProvidedPhasedActionRunner.java:59) at org.gradle.launcher.exec.ChainingBuildActionRunner.run(ChainingBuildActionRunner.java:35) at org.gradle.internal.buildtree.ProblemReportingBuildActionRunner.run(ProblemReportingBuildActionRunner.java:49) at org.gradle.launcher.exec.BuildOutcomeReportingBuildActionRunner.run(BuildOutcomeReportingBuildActionRunner.java:71) at org.gradle.tooling.internal.provider.FileSystemWatchingBuildActionRunner.run(FileSystemWatchingBuildActionRunner.java:135) at org.gradle.launcher.exec.BuildCompletionNotifyingBuildActionRunner.run(BuildCompletionNotifyingBuildActionRunner.java:41) at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.lambda$execute$0(RootBuildLifecycleBuildActionExecutor.java:54) at org.gradle.composite.internal.DefaultRootBuildState.run(DefaultRootBuildState.java:130) at org.gradle.launcher.exec.RootBuildLifecycleBuildActionExecutor.execute(RootBuildLifecycleBuildActionExecutor.java:54) at org.gradle.internal.buildtree.InitDeprecationLoggingActionExecutor.execute(InitDeprecationLoggingActionExecutor.java:62) at org.gradle.internal.buildtree.InitProblems.execute(InitProblems.java:36) at org.gradle.internal.buildtree.DefaultBuildTreeContext.execute(DefaultBuildTreeContext.java:40) at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.lambda$execute$0(BuildTreeLifecycleBuildActionExecutor.java:71) at org.gradle.internal.buildtree.BuildTreeState.run(BuildTreeState.java:60) at org.gradle.launcher.exec.BuildTreeLifecycleBuildActionExecutor.execute(BuildTreeLifecycleBuildActionExecutor.java:71) at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$2.call(RunAsBuildOperationBuildActionExecutor.java:67) at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor$2.call(RunAsBuildOperationBuildActionExecutor.java:63) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:210) at org.gradle.internal.operations.DefaultBuildOperationRunner$CallableBuildOperationWorker.execute(DefaultBuildOperationRunner.java:205) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:67) at org.gradle.internal.operations.DefaultBuildOperationRunner$2.execute(DefaultBuildOperationRunner.java:60) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:167) at org.gradle.internal.operations.DefaultBuildOperationRunner.execute(DefaultBuildOperationRunner.java:60) at org.gradle.internal.operations.DefaultBuildOperationRunner.call(DefaultBuildOperationRunner.java:54) at org.gradle.launcher.exec.RunAsBuildOperationBuildActionExecutor.execute(RunAsBuildOperationBuildActionExecutor.java:63) at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.lambda$execute$0(RunAsWorkerThreadBuildActionExecutor.java:36) at org.gradle.internal.work.DefaultWorkerLeaseService.withLocks(DefaultWorkerLeaseService.java:263) at org.gradle.internal.work.DefaultWorkerLeaseService.runAsWorkerThread(DefaultWorkerLeaseService.java:127) at org.gradle.launcher.exec.RunAsWorkerThreadBuildActionExecutor.execute(RunAsWorkerThreadBuildActionExecutor.java:36) at org.gradle.tooling.internal.provider.continuous.ContinuousBuildActionExecutor.execute(ContinuousBuildActionExecutor.java:110) at org.gradle.tooling.internal.provider.SubscribableBuildActionExecutor.execute(SubscribableBuildActionExecutor.java:64) at org.gradle.internal.session.DefaultBuildSessionContext.execute(DefaultBuildSessionContext.java:46) at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor$ActionImpl.apply(BuildSessionLifecycleBuildActionExecutor.java:92) at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor$ActionImpl.apply(BuildSessionLifecycleBuildActionExecutor.java:80) at org.gradle.internal.session.BuildSessionState.run(BuildSessionState.java:73) at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor.execute(BuildSessionLifecycleBuildActionExecutor.java:62) at org.gradle.internal.buildprocess.execution.BuildSessionLifecycleBuildActionExecutor.execute(BuildSessionLifecycleBuildActionExecutor.java:41) at org.gradle.internal.buildprocess.execution.StartParamsValidatingActionExecutor.execute(StartParamsValidatingActionExecutor.java:64) at org.gradle.internal.buildprocess.execution.StartParamsValidatingActionExecutor.execute(StartParamsValidatingActionExecutor.java:32) at org.gradle.internal.buildprocess.execution.SessionFailureReportingActionExecutor.execute(SessionFailureReportingActionExecutor.java:51) at org.gradle.internal.buildprocess.execution.SessionFailureReportingActionExecutor.execute(SessionFailureReportingActionExecutor.java:39) at org.gradle.internal.buildprocess.execution.SetupLoggingActionExecutor.execute(SetupLoggingActionExecutor.java:47) at org.gradle.internal.buildprocess.execution.SetupLoggingActionExecutor.execute(SetupLoggingActionExecutor.java:31) at org.gradle.launcher.daemon.server.exec.ExecuteBuild.doBuild(ExecuteBuild.java:70) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.WatchForDisconnection.execute(WatchForDisconnection.java:39) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.ResetDeprecationLogger.execute(ResetDeprecationLogger.java:29) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.RequestStopIfSingleUsedDaemon.execute(RequestStopIfSingleUsedDaemon.java:35) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.ForwardClientInput.lambda$execute$0(ForwardClientInput.java:40) at org.gradle.internal.daemon.clientinput.ClientInputForwarder.forwardInput(ClientInputForwarder.java:80) at org.gradle.launcher.daemon.server.exec.ForwardClientInput.execute(ForwardClientInput.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.LogAndCheckHealth.execute(LogAndCheckHealth.java:64) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.LogToClient.doBuild(LogToClient.java:63) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.EstablishBuildEnvironment.doBuild(EstablishBuildEnvironment.java:84) at org.gradle.launcher.daemon.server.exec.BuildCommandOnly.execute(BuildCommandOnly.java:37) at org.gradle.launcher.daemon.server.api.DaemonCommandExecution.proceed(DaemonCommandExecution.java:104) at org.gradle.launcher.daemon.server.exec.StartBuildOrRespondWithBusy$1.run(StartBuildOrRespondWithBusy.java:52) at org.gradle.launcher.daemon.server.DaemonStateCoordinator.lambda$runCommand$0(DaemonStateCoordinator.java:321) at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:64) at org.gradle.internal.concurrent.AbstractManagedExecutor$1.run(AbstractManagedExecutor.java:48) Deprecated Gradle features were used in this build, making it incompatible with Gradle 9.0. You can use '--warning-mode all' to show the individual deprecation warnings and determine if they come from your own scripts or plugins. For more on this, please refer to https://docs.gradle.org/8.13/userguide/command_line_interface.html#sec:command_line_warnings in the Gradle documentation. Ask Gemini
11-26
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值