Vulcan Spring 公司是家專業(yè)制造精密特種彈簧的美國企業(yè),成立于1967年,現(xiàn)坐落于紐約西南部的賓州泰爾夫德市,生產(chǎn)的彈簧被用于外太空探測領(lǐng)域,人造衛(wèi)星和火星上的漫游者號等.
Vulcan Spring公司生產(chǎn)的彈簧以精巧,精確和壽命長而聞名,美國通用汽車GM公司、GE公司、摩托羅拉、波音公司、3M、埃默森Emerson公司等世界著名公司都是Vulcan公司的客戶。Vulcan 為客戶定制不同的彈簧。同時,在英國,德國,法國,意大利,中國臺灣、中國香港等國家和地區(qū)也有Vulcan公司的產(chǎn)品,Vulcan的產(chǎn)品 (PullBox等)在沃爾瑪?shù)却笮统袘?yīng)用廣泛.
Vulcan Spring工廠占地面積5600平方米,那里涵蓋了生產(chǎn)彈簧產(chǎn)品所有的生產(chǎn)工序.同時,公司內(nèi)部還擁有一支設(shè)計經(jīng)驗豐富、專業(yè)技術(shù)和制造能力過硬的彈簧設(shè)計專家隊伍,能快速提供客戶所需彈簧樣品,為客戶提供新產(chǎn)品設(shè)計并改善其現(xiàn)有產(chǎn)品的性能??蛻羧缬刑厥庖?,彈簧專家將協(xié)同客戶一起開發(fā)新產(chǎn)品.
Vulcan Spring 產(chǎn)品應(yīng)用范圍廣,可用于家電產(chǎn)品、動力工具、電動馬達、玩具、工業(yè)設(shè)備、辦公設(shè)備、“彈出式”陳列架、機械工具、電動設(shè)備、電子、外科儀器、X射線和核磁共振設(shè)備等諸多領(lǐng)域.
主要產(chǎn)品包括:
Contorque(恒扭力彈簧) ,該產(chǎn)品采用獨到的設(shè)計,Contorque彈簧在勢能不變的情況下可旋轉(zhuǎn)數(shù)圈,適于電纜延伸并可替代電池電機或配重。
電機電刷彈簧,為電機換向器電刷受力穩(wěn)固提供了理想手段,可減小電刷磨損,從而提高電機的作業(yè)性能。
Conpower動力彈簧,這種彈簧在比力矩不高的情況下可旋轉(zhuǎn)很多圈。彈簧由心軸或盒提供旋轉(zhuǎn)能或借助滑輪或纜線來提供線性運動。Vulcan還制造非預(yù)應(yīng)力動力彈簧。
機械卷筒,該產(chǎn)品能為需要平衡、回收或返回的應(yīng)用提供動力。在需要長偏轉(zhuǎn)的應(yīng)用中,機械卷筒供力穩(wěn)定且壽命期長。
其他定制彈簧,從沖壓片和封槽到線材成形、扭力彈簧、十字扣帶和定制的板簧設(shè)計。
媒體評為鍋具中的奔馳,鍋具中的香奈兒 完美的水封設(shè)計,將鍋內(nèi)水氣留住,維持食物的色澤與鮮美,真正達到無水烹調(diào)的極致。五曾復(fù)合合金傳熱極佳,熱能能有效均勻的傳達至鍋底到鍋身,...
您好,據(jù)我所知瑞士瑞蓮鍋具質(zhì)量還算是不錯。spring沒用過也不好亂說 鍋產(chǎn)品質(zhì)量在二線品牌中算是挺好的,質(zhì)量一點也不比一線中一些品牌差,做工精細,好漂亮的又好用,外觀光可鑒人,手感厚實光滑,很高大上...
spring是中國最大、全球第二的炊具研發(fā)制造商,中國廚房小家電領(lǐng)先品牌。產(chǎn)品的技術(shù)都是國內(nèi)最新的,質(zhì)量更是有幾十年沉淀的口碑在那里。
格式:pdf
大小:82KB
頁數(shù): 6頁
評分: 4.4
Spring 框架 課程設(shè)計指導(dǎo)書 長春工業(yè)大學(xué) 計算機科學(xué)與工程學(xué)院 2015 年 7 月 1 一、實驗?zāi)康?Spring 是一個開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的。 框架的主要優(yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許您選擇使用哪一個組件, 同時為 J2EE 應(yīng)用程序開發(fā)提供集成的框架。 按照所學(xué)的知識,設(shè)計開發(fā)一個小型的電子商務(wù)類系統(tǒng)。旨在通過完成一 個項目的開發(fā) ,通過實際問題培養(yǎng)學(xué)生的動手能力,并且使學(xué)生更加深入的理解 和靈活掌握教學(xué)內(nèi)容。通過實驗使學(xué)生更加熟練的掌握 Myeclipse 的使用,使 學(xué)生更加深入的了解 java web 的開源框架的使用。 二、實驗要求 1、課程設(shè)計時間為一周,以 3 人為一小組,每個小組在設(shè)計的第一天進 行選題,制訂進度計劃,分配任務(wù),在設(shè)計的最后一天整理系統(tǒng)文檔,形成設(shè) 計報告。 2、根據(jù)課程設(shè)計的目的、要求認真準(zhǔn)備。不遲到、不早
格式:pdf
大?。?span id="on9r6pn" class="single-tag-height">82KB
頁數(shù): 5頁
評分: 4.8
在Jave EE應(yīng)用開發(fā)中,使用優(yōu)秀的框架可以提高系統(tǒng)的開發(fā)效率、更穩(wěn)定的性能、同時有利于后期的維護和更新。通過整合Struts 2、JPA、Spring 2三個框架,構(gòu)建了一種輕量級Java EE架構(gòu)。該架構(gòu)以Spring 2為核心,整合JPA進行持久化訪問;整合Struts 2以MVC模式控制。并利用此架構(gòu)設(shè)計開發(fā)了基于ITIL的IT服務(wù)管理中服務(wù)臺系統(tǒng)。實踐證明,該架構(gòu)使得項目開發(fā)簡潔、結(jié)構(gòu)清晰,并具有良好的復(fù)用性、擴展性和可維護性。
其主要功能有:①控制機械的運動,如內(nèi)燃機中的閥門彈簧、離合器中的控制彈簧等。②吸收振動和沖擊能量,如汽車、火車車廂下的緩沖彈簧、聯(lián)軸器中的吸振彈簧等。③儲存及輸出能量作為動力,如鐘表彈簧、槍械中的彈簧等。④用作測力元件,如測力器、彈簧秤中的彈簧等。彈簧的載荷與變形之比稱為彈簧剛度,剛度越大,則彈簧越硬。
按受力性質(zhì),彈簧可分為拉伸彈簧、壓縮彈簧、扭轉(zhuǎn)彈簧和彎曲彈簧,按形狀可分為螺旋彈簧、碟形彈簧、環(huán)形彈簧、板彈簧、平面蝸卷彈簧以及扭桿彈簧等。普通圓柱螺旋彈簧由于制造簡單,且可根據(jù)受載情況制成各種型式,結(jié)構(gòu)簡單,故應(yīng)用最廣。彈簧的制造材料一般來說應(yīng)具有高的彈性極限、疲勞極限、沖擊韌性及良好的熱處理性能等,常用的有碳素彈簧鋼、合金彈簧鋼、不銹彈簧鋼以及銅合金、鎳合金和橡膠等。彈簧的制造方法有冷卷法和熱卷法。彈簧絲直徑小于8毫米的一般用冷卷法,大于8毫米的用熱卷法。有些彈簧在制成后還要進行強壓或噴丸處理,可提高彈簧的承載能力。
來源:hengyunabc ,
hengyunabc.github.io/depth-analysis-hibernate-validar-noclassdefounderror/
問題
可重現(xiàn)的Demo代碼:demo.zip
http://hengyunabc.github.io/img/demo.zip
最近排查一個spring boot應(yīng)用拋出hibernate.validator NoClassDefFoundError的問題,異常信息如下:
Caused by: java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.internal.engine.ConfigurationImpl
at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:33) ~[hibernate-validator-5.3.5.Final.jar:5.3.5.Final]
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276) ~[validation-api-1.1.0.Final.jar:na]
at org.springframework.boot.validation.MessageInterpolatorFactory.getObject(MessageInterpolatorFactory.java:53) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at org.springframework.boot.autoconfigure.validation.DefaultValidatorConfiguration.defaultValidator(DefaultValidatorConfiguration.java:43) ~[spring-boot-autoconfigure-1.5.3.RELEASE.jar:1.5.3.RELEASE]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_112]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_112]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_112]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_112]
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162) ~[spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE]
... 32 common frames omitted
這個錯誤信息表面上是NoClassDefFoundError,但是實際上ConfigurationImpl這個類是在hibernate-validator-5.3.5.Final.jar里的,不應(yīng)該出現(xiàn)找不到類的情況。
那為什么應(yīng)用里拋出這個NoClassDefFoundError ?
有經(jīng)驗的開發(fā)人員從Could not initialize class 這個信息就可以知道,實際上是一個類在初始化時拋出的異常,比如static的靜態(tài)代碼塊,或者static字段初始化的異常。
誰初始化了 org.hibernate.validator.internal.engine.ConfigurationImpl
但是當(dāng)我們在HibernateValidator 這個類,創(chuàng)建ConfigurationImpl的代碼塊里打斷點時,發(fā)現(xiàn)有兩個線程觸發(fā)了斷點:
public class HibernateValidator implements ValidationProvider<HibernateValidatorConfiguration> {
@Override
public Configuration<?> createGenericConfiguration(BootstrapState state) {
return new ConfigurationImpl( state );
}
其中一個線程的調(diào)用棧是:
Thread [background-preinit] (Class load: ConfigurationImpl)
HibernateValidator.createGenericConfiguration(BootstrapState) line: 33
Validation$GenericBootstrapImpl.configure() line: 276
BackgroundPreinitializer$ValidationInitializer.run() line: 107
BackgroundPreinitializer$1.runSafely(Runnable) line: 59
BackgroundPreinitializer$1.run() line: 52
Thread.run() line: 745
另外一個線程調(diào)用棧是:
Thread [main] (Suspended (breakpoint at line 33 in HibernateValidator))
owns: ConcurrentHashMap<K,V> (id=52)
owns: Object (id=53)
HibernateValidator.createGenericConfiguration(BootstrapState) line: 33
Validation$GenericBootstrapImpl.configure() line: 276
MessageInterpolatorFactory.getObject() line: 53
DefaultValidatorConfiguration.defaultValidator() line: 43
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 62
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 43
Method.invoke(Object, Object...) line: 498
CglibSubclassingInstantiationStrategy(SimpleInstantiationStrategy).instantiate(RootBeanDefinition, String, BeanFactory, Object, Method, Object...) line: 162
ConstructorResolver.instantiateUsingFactoryMethod(String, RootBeanDefinition, Object[]) line: 588
DefaultListableBeanFactory(AbstractAutowireCapableBeanFactory).instantiateUsingFactoryMethod(String, RootBeanDefinition, Object[]) line: 1173
顯然,這個線程的調(diào)用棧是常見的spring的初始化過程。
BackgroundPreinitializer 做了什么
那么重點來看下 BackgroundPreinitializer 線程做了哪些事情:
@Order(LoggingApplicationListener.DEFAULT_ORDER + 1)
public class BackgroundPreinitializer
implements ApplicationListener<ApplicationEnvironmentPreparedEvent> {
@Override
public void onApplicationEvent(ApplicationEnvironmentPreparedEvent event) {
try {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
runSafely(new MessageConverterInitializer());
runSafely(new MBeanFactoryInitializer());
runSafely(new ValidationInitializer());
runSafely(new JacksonInitializer());
runSafely(new ConversionServiceInitializer());
}
public void runSafely(Runnable runnable) {
try {
runnable.run();
}
catch (Throwable ex) {
// Ignore
}
}
}, "background-preinit");
thread.start();
}
可以看到BackgroundPreinitializer類是spring boot為了加速應(yīng)用的初始化,以一個獨立的線程來加載hibernate validator這些組件。
這個 background-preinit 線程會吞掉所有的異常。
顯然ConfigurationImpl 初始化的異常也被吞掉了,那么如何才能獲取到最原始的信息?
獲取到最原始的異常信息
在BackgroundPreinitializer的 run() 函數(shù)里打一個斷點(注意是Suspend thread類型, 不是Suspend VM),讓它先不要觸發(fā)ConfigurationImpl的加載,讓spring boot的正常流程去觸發(fā)ConfigurationImpl的加載,就可以知道具體的信息了。
那么打出來的異常信息是:
Caused by: java.lang.NoSuchMethodError: org.jboss.logging.Logger.getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object;
at org.hibernate.validator.internal.util.logging.LoggerFactory.make(LoggerFactory.java:19) ~[hibernate-validator-5.3.5.Final.jar:5.3.5.Final]
at org.hibernate.validator.internal.util.Version.<clinit>(Version.java:22) ~[hibernate-validator-5.3.5.Final.jar:5.3.5.Final]
at org.hibernate.validator.internal.engine.ConfigurationImpl.<clinit>(ConfigurationImpl.java:71) ~[hibernate-validator-5.3.5.Final.jar:5.3.5.Final]
at org.hibernate.validator.HibernateValidator.createGenericConfiguration(HibernateValidator.java:33) ~[hibernate-validator-5.3.5.Final.jar:5.3.5.Final]
at javax.validation.Validation$GenericBootstrapImpl.configure(Validation.java:276) ~[validation-api-1.1.0.Final.jar:na]
at org.springframework.boot.validation.MessageInterpolatorFactory.getObject(MessageInterpolatorFactory.java:53) ~[spring-boot-1.5.3.RELEASE.jar:1.5.3.RELEASE]
那么可以看出是 org.jboss.logging.Logger 這個類不兼容,少了getMessageLogger(Ljava/lang/Class;Ljava/lang/String;)Ljava/lang/Object 這個函數(shù)。
那么檢查下應(yīng)用的依賴,可以發(fā)現(xiàn)org.jboss.logging.Logger 在jboss-common-1.2.1.GA.jar和jboss-logging-3.3.1.Final.jar里都有。
顯然是jboss-common-1.2.1.GA.jar 這個依賴過時了,需要排除掉。
總結(jié)異常的發(fā)生流程
應(yīng)用依賴了jboss-common-1.2.1.GA.jar,它里面的org.jboss.logging.Logger太老 spring boot啟動時,BackgroundPreinitializer里的線程去嘗試加載ConfigurationImpl,然后觸發(fā)了org.jboss.logging.Logger的函數(shù)執(zhí)行問題 BackgroundPreinitializer 吃掉了異常信息,jvm把ConfigurationImpl標(biāo)記為不可用的 spring boot正常的流程去加載ConfigurationImpl,jvm發(fā)現(xiàn)ConfigurationImpl類是不可用,直接拋出NoClassDefFoundErrorCaused by: java.lang.NoClassDefFoundError: Could not initialize class org.hibernate.validator.internal.engine.ConfigurationImpl
深入JVM
為什么第二次嘗試加載ConfigurationImpl時,會直接拋出java.lang.NoClassDefFoundError: Could not initialize class ?
下面用一段簡單的代碼來重現(xiàn)這個問題:
try {
org.hibernate.validator.internal.util.Version.touch();
} catch (Throwable e) {
e.printStackTrace();
}
System.in.read();
try {
org.hibernate.validator.internal.util.Version.touch();
} catch (Throwable e) {
e.printStackTrace();
}
使用HSDB來確定類的狀態(tài)
當(dāng)拋出第一個異常時,嘗試用HSDB來看下這個類的狀態(tài)。
sudo java -classpath "$JAVA_HOME/lib/sa-jdi.jar" sun.jvm.hotspot.HSDB
然后在HSDB console里查找到Version的地址信息
hsdb> class org.hibernate.validator.internal.util.Version
org/hibernate/validator/internal/util/Version @0x00000007c0060218
然后在Inspector查找到這個地址,發(fā)現(xiàn)_init_state是5。
再看下hotspot代碼,可以發(fā)現(xiàn)5對應(yīng)的定義是initialization_error:
// /hotspot/src/share/vm/oops/instanceKlass.hpp
// See "The Java Virtual Machine Specification" section 2.16.2-5 for a detailed deion
// of the class loading & initialization procedure, and the use of the states.
enum ClassState {
allocated, // allocated (but not yet linked)
loaded, // loaded and inserted in class hierarchy (but not linked yet)
linked, // successfully linked/verified (but not initialized yet)
being_initialized, // currently running class initializer
fully_initialized, // initialized (successfull final state)
initialization_error // error happened during initialization
};
JVM規(guī)范里關(guān)于Initialization的內(nèi)容
http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-5.html#jvms-5.5
從規(guī)范里可以看到初始一個類/接口有12步,比較重要的兩步都用黑體標(biāo)記出來了:
5: If the Class object for C is in an erroneous state, then initialization is not possible. Release LC and throw a NoClassDefFoundError. 11: Otherwise, the class or interface initialization method must have completed abruptly by throwing some exception E. If the class of E is not Error or one of its subclasses, then create a new instance of the class ExceptionInInitializerError with E as the argument, and use this object in place of E in the following step.第一次嘗試加載Version類時
當(dāng)?shù)谝淮螄L試加載時,hotspot InterpreterRuntime在解析invokestatic指令時,嘗試加載org.hibernate.validator.internal.util.Version類,InstanceKlass的_init_state先是標(biāo)記為being_initialized,然后當(dāng)加載失敗時,被標(biāo)記為initialization_error。
對應(yīng)Initialization的11步。
// hotspot/src/share/vm/oops/instanceKlass.cpp
// Step 10 and 11
Handle e(THREAD, PENDING_EXCEPTION);
CLEAR_PENDING_EXCEPTION;
// JVMTI has already reported the pending exception
// JVMTI internal flag reset is needed in order to report ExceptionInInitializerError
JvmtiExport::clear_detected_exception((JavaThread*)THREAD);
{
EXCEPTION_MARK;
this_oop->set_initialization_state_and_notify(initialization_error, THREAD);
CLEAR_PENDING_EXCEPTION; // ignore any exception thrown, class initialization error is thrown below
// JVMTI has already reported the pending exception
// JVMTI internal flag reset is needed in order to report ExceptionInInitializerError
JvmtiExport::clear_detected_exception((JavaThread*)THREAD);
}
DTRACE_CLASSINIT_PROBE_WAIT(error, InstanceKlass::cast(this_oop()), -1,wait);
if (e->is_a(SystemDictionary::Error_klass())) {
THROW_OOP(e());
} else {
JavaCallArguments args(e);
THROW_ARG(vmSymbols::java_lang_ExceptionInInitializerError(),
vmSymbols::throwable_void_signature(),
&args);
}
第二次嘗試加載Version類時
當(dāng)?shù)诙螄L試加載時,檢查InstanceKlass的_init_state是initialization_error,則直接拋出NoClassDefFoundError: Could not initialize class.
對應(yīng)Initialization的5步。
// hotspot/src/share/vm/oops/instanceKlass.cpp
void InstanceKlass::initialize_impl(instanceKlassHandle this_oop, TRAPS) {
// ...
// Step 5
if (this_oop->is_in_error_state()) {
DTRACE_CLASSINIT_PROBE_WAIT(erroneous, InstanceKlass::cast(this_oop()), -1,wait);
ResourceMark rm(THREAD);
const char* desc = "Could not initialize class ";
const char* className = this_oop->external_name();
size_t msglen = strlen(desc) + strlen(className) + 1;
char* message = NEW_RESOURCE_ARRAY(char, msglen);
if (NULL == message) {
// Out of memory: can't create detailed error message
THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), className);
} else {
jio_snprintf(message, msglen, "%s%s", desc, className);
THROW_MSG(vmSymbols::java_lang_NoClassDefFoundError(), message);
}
}
總結(jié)
彈力測試儀目的
本機專為沙發(fā)彈簧框架和彈簧包而設(shè)計的測試儀器,它可滿足以下三種測試要求
This tester is designed for the test of the zig-zag spring assembly and spring pack used in sofa manufacturing , it can perform the following 3 kinds of test requirements
1)耐久性測試 / Durability Tes 可按預(yù)設(shè)定之壓力條件進行重復(fù)按壓測試,周期可預(yù)設(shè)定,到數(shù)自動停止。
The spring undergone a repeated specific force , the test cycles is pre-settable, and the test stop when the set cycle is up.
2)壓縮量程與壓力關(guān)系檢測 / Fix stroke test
壓板按預(yù)設(shè)定行程下壓, 到位停止。在壓力表上讀取該行程的彈簧力.
The presser comes down to a specify stoke, read the force on that stroke from the pressure gauge.
3)特定壓力下彈簧壓縮量檢測 / Fix force test
壓板下壓至設(shè)定壓力后停止,顯示屏上顯示該壓力值的壓縮行程長度。
The presser comes down to a specify force, the presser stop and the compression rate (stroke)
will be displayed on the screen.
注:
a) 本機最大壓力 = 80 公斤, 最高按壓行程150 mm。
b) 壓力傳感器精度:0.3% FS
c) 行程精度 : ±0.2 mm
d)電源: 220伏, 功率= 400瓦