java - 如何使用maven为Spring指定loadTimeWeaver

标签 java spring maven intellij-idea

我有一个奇怪的错误。我有一个基本的 Spring Boot Web 服务器在我的 intelliJIDEA IDE 中运行(在 jetty 上)。

当我运行 Maven 'package' 命令,而不是尝试从命令行运行 Web 服务器时,它给我一个 loadTimeWeaver 错误。我不明白这两个运行环境之间的区别,在我看来它确实应该有效。

在 IDEA 中,我在运行配置中指定以下内容:
主类:package.Starter
虚拟机选项:-javaagent:C:/Users/newb/EXT_LIBS/spring-instrument-4.0.3.RELEASE.jar -noverify

在命令行上我尝试执行以下操作:
java -javaagent:C:/Users/newb/EXT_LIBS/spring-instrument-4.0.3.RELEASE.jar -noverify -jar target\MySpringServer.war

但我收到以下错误:

java.lang.reflect.InvocationTargetException
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
        at java.lang.reflect.Method.invoke(Unknown Source)
        at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:53)
        at java.lang.Thread.run(Unknown Source)
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [applicationContext.xml]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Cannot apply class transformer without LoadTimeWeaver specified
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1553)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:539)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:475)
        at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:304)
        at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:228)
        at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:300)
        at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:195)
        at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:973)
        at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:750)
        at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:482)
        at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:120)
        at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:648)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:311)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:909)
        at org.springframework.boot.SpringApplication.run(SpringApplication.java:898)
        at au.net.iinet.operational.Starter.main(Starter.java:48)
        ... 6 more
Caused by: java.lang.IllegalStateException: Cannot apply class transformer without LoadTimeWeaver specified
        at org.springframework.orm.jpa.persistenceunit.SpringPersistenceUnitInfo.addTransformer(SpringPersistenceUnitInfo.java:80)
        at org.eclipse.persistence.jpa.PersistenceProvider.createContainerEntityManagerFactory(PersistenceProvider.java:348)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:336)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:318)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1612)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1549)
        ... 21 more

解决 loadTimeWeaver 问题的最佳方法是什么?是否有理由它可以在我的 IDE 中工作,但不能在它之外工作?我已经陷入了尝试强制设置 loadTimeWeaver 的困境,但这并不是一件小事,而且它在我的 IDE 中工作的事实意味着我只需检查一些非常小的事情。

提前致谢。

编辑:
我找到了答案!以下问题对我非常有帮助:I use load time weaving in spring. How can i set class loader in jetty?
基本上,我还需要在命令行上指定 -Xbootclasspath/a:C:/Users/newb/EXT_LIBS/spring-instrument-4.0.3.RELEASE.jar 。现在它不会给我那些加载时间编织错误!哇!

最佳答案

这应该可以解决您的问题。

@Bean
public InstrumentationLoadTimeWeaver loadTimeWeaver()  throws Throwable {
    InstrumentationLoadTimeWeaver loadTimeWeaver = new InstrumentationLoadTimeWeaver();
    return loadTimeWeaver;
}

同样可以在 xml 中完成配置。

发现一个新的library这只是解决动态设置 spring InstrumentationLoadTimeWeaver 以启用对方面的支持,而无需使用显式 java 代理启动 JVM

<dependency>
    <groupId>de.invesdwin</groupId>
    <artifactId>invesdwin-instrument</artifactId>
    <version>1.0.2</version>
</dependency>

Spring启动配置

@SpringBootApplication
/** 
 * Make @Configurable work via @EnableLoadTimeWeaving.
 * If it does not work, alternatively you can try: 
 * @ImportResource(locations = "classpath:/META-INF/ctx.spring.weaving.xml") 
 */
@EnableLoadTimeWeaving
public class MySpringBootApplication {
    public static void main(final String[] args) {
        DynamicInstrumentationLoader.waitForInitialized(); //dynamically attach java agent to jvm if not already present
        DynamicInstrumentationLoader.initLoadTimeWeavingContext(); //weave all classes before they are loaded as beans
        SpringApplication.run(MySpringBootApplication.class, args); //start application, load some classes
    }
}

关于java - 如何使用maven为Spring指定loadTimeWeaver,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25843055/

相关文章:

spring - @ControllerAdvice处理异常,但不自定义响应

java - 读取属性文件

java - 将 Spring 应用程序部署到 JBoss 时出错 - NoSuchMethodError

java - 仅在一个浏览器中运行 java web 应用程序

java - 从 double 到 float 的可能有损转换

java - 我如何引用另一个类的对象

java - 快速排序的递归参数

spring - 如何在 Spring Security 6 中自定义 expressionHandler 和 accessDecisionManager

Spring Boot,静态资源和mime类型配置

java - IntelliJ + Maven Shade : A JNI error has occurred, 请检查您的安装并重试