latar belakang
Springboot semakin banyak digunakan oleh semua orang untuk mencapai penyebaran panas menggunakan Springboot Devtool
Kelas CastException yang sama muncul
menganalisa
Pertama, tentukan apakah CastException dari kelas yang sama muncul, misalnya, karena ClassLoader berbeda.
Apakah kelas sama tergantung pada dua faktor
Artinya, kelas yang dijelaskan oleh classloader yang berbeda adalah kelas yang berbeda
Penggunaan umum JDBC saat kita belajar
/** * Mengembalikan objek {@code class} yang terkait dengan antarmuka kelas atau * dengan nama string yang diberikan. Meminta metode ini adalah * setara dengan: * * <BLOCKQUOTE> * {@Code class.forname (className, true, currentLoader)} * </lockquote> * di mana {@code currentLoader} menunjukkan loader kelas yang menentukan * kelas saat ini. * * <p> Misalnya, fragmen kode berikut mengembalikan * runtime {@code class} deskriptor untuk kelas bernama * {@code java.lang.thread}: * <BlockQuote> * {@code class t = class.forname ("java.lang.thread") {@code </blockquote) @co @co <c> @co@@@@@@@@@@@@@@@@code@@code@@code * menyebabkan kelas bernama * {@code x} diinisialisasi. * * @param classname Nama kelas yang sepenuhnya memenuhi syarat. * @return objek {@code class} untuk kelas dengan * nama yang ditentukan. * @Exception LinkageError Jika tautan gagal * @Exception ExceptionInitializererRor Jika inisialisasi diprovokasi * dengan metode ini gagal * @Exception classNotFoundException jika kelas tidak dapat ditemukan */kelas statis public <?> FORNAME (string className) melempar classnotfoundException {return forName forName (classname) (classname, classnotfoundException {return forName forName forName (classname (classname, classnotfoundException {public forname forName forName forName forName (classname 0 Classloader.getCallerClassLoader ());}Dari hal di atas kita dapat memahami bahwa kelas yang sama yang dijelaskan oleh classloader yang berbeda tidak dapat saling mengkonversi.
Dengan cara ini kami menargetkan DevTools.
Kami telah memperkenalkan dependensi berikut di Springboot
<dependency> <GroupId> org.springframework.boot </groupid> <ArTifactId> Spring-boot-devtools </artifactid> <pilihan> true </opsional> </dependency>
Jadi bagaimana cara mengecualikan dependensi Devtool?
Tambahkan Application.Properties
spring.devtools.restart.enabled = false
Saya menemukan bahwa restartedmain yang digunakan masih dapat dilihat saat memulai
Info 2018.3428 --- [restartedmain] swsmmarequestmappingHandlerapter: mencari @controlleradvice: org.springframework.boot.context.mbedded. 22:03:34 CST 2018]; akar hierarki konteks
Info 53428 --- [restartedmain] swsmmarequestmappappingHandlerapter: terdeteksi responsbodyadvice bean di org.springframework.bootcuate.Autoconfigure.endPointWebMvchypermanManageMagement.Autoconfigure.endPoPPointPoCoPoConPOntagle.endPoPPOINTCOMAGLENGY
2018-03-19-04: 37.956 Info 53428 --- [restartedmain] oswshandler.simpleurlhandlermapping: dipetakan Jalur URL [/swagger-ui.html] ke pawang tipe [class org.springframework.web.servlet.reesource.
2018-03-19 22: 04: 37.956 Info 53428 --- [RestartedMain] Oswshandler.Simpleurlhandlermapping
Mengapa utas bernama restartedmain set spring.devtools.restart.enabled tidak valid?
Kode
ApplicationListener digunakan dalam paket yang sesuai dengan devtools
Private Void onApplicationStartEvent (Acara ApplicationStartEvent) {// Masih terlalu dini untuk menggunakan lingkungan Spring tetapi kita masih harus mengizinkan // pengguna untuk menonaktifkan restart menggunakan properti sistem. String enabled = system.getProperty (enabled_property); if (enabled == null || boolean.parseboolean (diaktifkan)) {string [] args = event.getArgs (); Defaultrestartinitializer initializer = DEFAULTRESTARITIalizer baru (); boolean resartoninitialize =! agentreloader.isactive (); Restarter.initialize (args, false, inisialisasi, restartoninitialize); } else {restarter.disable (); }}Jelas bahwa restarter sebenarnya dibaca dari variabel sistem daripada dari lingkungan musim semi. Seperti yang dikatakan komentar, sebenarnya terlalu dini untuk menggunakan properti Spring pada saat ini.
Oleh karena itu, variabel sistem dapat digunakan
Oleh karena itu kita dapat menggunakan parameter JVM
-Dspring.devtools.restart.enabled = false
Benar saja, semuanya baik -baik saja saat ini
2018-03-19 22: 18: 12.928 Info 66260 --- [Main] com.f6car.base.Application: Profil berikut aktif: dev
Info 66260 --- [utama] ationconfigbeddeddedWebApplicationContext: menyegarkan org.springframework.boot.context.embedded.annotationconfigembeddedwapplicationContext@2a43cb: starton8 deveing: 22 22 222: 22 22A84CB: Starton8: start12: 22A84CB: Starton8: 22 22 MONPERDICINCICEDICATECContext akar hierarki konteks
Jadi apa tujuan konfigurasi dalam file konfigurasi Spring?
/*** Mulai ulang properti. */Public Static Class Restart {Private Static Final String Default_Restart_Excludes = "Meta-Inf/Maven/**," + "Meta-Inf/Resources/**, Sumber Daya/**, Statis/**, Publik/**, Templat/**," + "**/*test.class, **/*tests.class, git.properties, meta-inf/build-info.properties"; private static final long default_restart_poll_interval = 1000; private static final long default_restart_quiet_period = 400; /*** Aktifkan restart otomatis. */ private boolean diaktifkan = true; /*** Pola yang harus dikecualikan dari memicu restart penuh. */ string privat tidak termasuk = default_restart_excludes; /*** Pola tambahan yang harus dikecualikan dari memicu restart penuh. */ string private slopealexclude; /*** Jumlah waktu (dalam juta detik) untuk menunggu antara pemungutan suara untuk perubahan ClassPath. */ private long pollInterval = default_restart_poll_interval; /** * Jumlah waktu tenang (dalam juta detik) diperlukan tanpa perubahan classpath * sebelum restart dipicu. */ private long sunyi adiod = default_restart_quiet_period; /*** Nama file tertentu yang ketika diubah akan memicu pemeriksaan restart. Jika * tidak ditentukan perubahan file classpath akan memicu restart. */ Private String TriggerFile; /*** Jalur tambahan untuk ditonton perubahan. */ Daftar Pribadi <FILE> TambahanPaths = ArrayList baru <FILE> (); public boolean isenabled () {return this.enabled; } public void setEnabled (boolean diaktifkan) {this.enabled = diaktifkan; }Dari kode, tampaknya digunakan untuk mengonfigurasi apakah mendengarkan dapat dimulainya secara otomatis
/*** Konfigurasi restart lokal. */ @ConditionAlonProperty (prefix = "spring.devtools.restart", name = "enabled", matchifmissing = true) class restartconfiguration {@autowired private devtoolsproperties properti; @EventListener public void onclasspathchanged (classpathchangedEvent event) {if (event.isResTartrequired ()) {restarter.getInstance (). Restart (FileWatchingFailureHandler baru (FileSySySteMWatcherFactory ())); }} @Bean @conditionAlonMissingBean Public ClassPathFileSyStemWatcher ClassPathFileSyStemWatcher () {url [] urls = restarter.getInstance (). GetInitialurls (); ClasspathfileSyStemWatcher watcher = new ClassPathFileSyStemWatcher (FileSySyStemWatcherFactory (), ClassPathRestArtStrategy (), URLS); Watcher.setStopWatcheronRestArt (true); pengamat kembali; } @Bean @conditionAlonMissingBean Public ClassPathRestAttrategy ClassPathRestArtStrategy () {return new PatternClassPathRestArtStrategy (this.properties.getRestArt (). Getallexclude ()); } @Bean hateoasobjenesiscachedisabler hateoasobjenesiscachedisabler () {return baru hateoasobjenesiscachedisabler (); } @Bean Public FilesyStemWatcherFactory FileSyStemWatcherFactory () {return FileSySyStemWatcherFactory () {@Override public fileSystemWatcher getFileSyStemWatcher () {return newFileSyStemWatcher (); }}; } private FilesyStemWatcher newFileSyStemWatcher () {restart restartProperties = this.properties.getRestArt (); FileSyStemWatcher Watcher = FileSystemWatcher baru (true, restartproperties.getPollInterVal (), restartproperties.getquietperiod ()); String triggerFile = restartProperties.getTriggerFile (); if (stringutils.haslength (triggerFile)) {watcher.settriggerFilter (triggerFileFilter baru (triggerFile)); } Daftar <FILE> TambahanPaths = RestartProperties.GetAdditialPaths (); untuk (jalur file: tambahanPaths) {watcher.addsourceFolder (path.getAbsoluteFile ()); } return watcher; }}}Seluruh konfigurasi mengembalikan apakah akan mendaftarkan layanan jam yang sesuai
Tentu saja kami juga bisa menghapus toples
Perlu dicatat bahwa ketika mengomentari kode ini, Anda harus kembali
mvn bersih
Jika tidak, tidak mungkin untuk secara otomatis mengecualikan toples
Di atas adalah semua konten artikel ini. Saya berharap ini akan membantu untuk pembelajaran semua orang dan saya harap semua orang akan lebih mendukung wulin.com.