Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为Gatling负载测试构建可执行JAR_Java_Load Testing_Gatling - Fatal编程技术网

Java 为Gatling负载测试构建可执行JAR

Java 为Gatling负载测试构建可执行JAR,java,load-testing,gatling,Java,Load Testing,Gatling,我是加特林(2.1.2)的新手,想做一个小的原型项目展示给我的同事 根据页面,我可以通过以下几种方式使用Gatling运行模拟: 将Gatling捆绑包解压缩到一个文件夹中,并将我的模拟文件放到用户文件/模拟文件夹中。bin/gatling.sh将编译并运行模拟文件 使用gatlingmaven插件maven插件执行模拟 使用gatling maven原型创建一个项目,并运行Engine类 我发现了这些问题 对于1,很难为模拟类添加依赖项。我必须弄清楚需要什么JAR,然后把它们放到lib文件夹中

我是加特林(2.1.2)的新手,想做一个小的原型项目展示给我的同事

根据页面,我可以通过以下几种方式使用Gatling运行模拟:

  • 将Gatling捆绑包解压缩到一个文件夹中,并将我的模拟文件放到用户文件/模拟文件夹中。bin/gatling.sh将编译并运行模拟文件
  • 使用
    gatlingmaven插件
    maven插件执行模拟
  • 使用
    gatling maven原型创建一个项目,并运行Engine类
  • 我发现了这些问题

    对于1,很难为模拟类添加依赖项。我必须弄清楚需要什么JAR,然后把它们放到lib文件夹中

    对于2,它需要安装maven

    对于3,它只从IDE运行

    我只需要一个简单的可执行JAR文件,将所有依赖项捆绑在一起(我的模拟、Gatling和第三方),并在任何机器上运行它(如EC2实例)

    有没有办法做到这一点

    更新1:

    我尝试了方法3,但将所有项目文件从
    test
    文件夹移动到
    main
    ,并使用
    maven汇编插件构建了一个具有依赖项的jar。当我试图运行该文件时,出现以下错误:

    Exception in thread "main" java.lang.ExceptionInInitializerError
        at Engine$.delayedEndpoint$Engine$1(Engine.scala:7)
        at Engine$delayedInit$body.apply(Engine.scala:4)
        at scala.Function0$class.apply$mcV$sp(Function0.scala:40)
        at scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)
        at scala.App$$anonfun$main$1.apply(App.scala:76)
        at scala.App$$anonfun$main$1.apply(App.scala:76)
        at scala.collection.immutable.List.foreach(List.scala:381)
        at scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35)
        at scala.App$class.main(App.scala:76)
        at Engine$.main(Engine.scala:4)
        at Engine.main(Engine.scala)
    Caused by: java.nio.file.FileSystemNotFoundException
        at com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171)
        at com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157)
        at java.nio.file.Paths.get(Paths.java:143)
        at io.gatling.core.util.PathHelper$.uri2path(PathHelper.scala:32)
        at IDEPathHelper$.<init>(IDEPathHelper.scala:7)
        at IDEPathHelper$.<clinit>(IDEPathHelper.scala)
        ... 11 more
    
    线程“main”java.lang.ExceptionInInitializeError中的异常 在引擎$.delayedEndpoint$引擎$1处(引擎.scala:7) 在引擎$delayedInit$body.apply处(引擎.scala:4) 在scala.Function0$class.apply$mcV$sp(Function0.scala:40) 在scala.runtime.AbstractFunction0.apply$mcV$sp(AbstractFunction0.scala:12)中 位于scala.App$$anonfun$main$1.apply(App.scala:76) 位于scala.App$$anonfun$main$1.apply(App.scala:76) 位于scala.collection.immutable.List.foreach(List.scala:381) 位于scala.collection.generic.TraversableForwarder$class.foreach(TraversableForwarder.scala:35) 位于scala.App$class.main(App.scala:76) 发动机$main时(发动机.scala:4) 在Engine.main(Engine.scala)处 原因:java.nio.file.FileSystemNotFoundException 位于com.sun.nio.zipfs.ZipFileSystemProvider.getFileSystem(ZipFileSystemProvider.java:171) 位于com.sun.nio.zipfs.ZipFileSystemProvider.getPath(ZipFileSystemProvider.java:157) 位于java.nio.file.Paths.get(path.java:143) 在io.gatling.core.util.PathHelper$.uri2path(PathHelper.scala:32)上 在IDEPathHelper$(IDEPathHelper.scala:7) 位于IDEPathHelper$(IDEPathHelper.scala) ... 还有11个

    我想这与Gatling配置有关,但不知道出了什么问题。

    我也尝试过类似的方法。我也不能用Maven。我会尽力记住我是如何做到这一点的

    1) 我已经配置了maven assembly plugin来生成具有如下依赖项的单个JAR:

    <plugin>
        <artifactId>maven-assembly-plugin</artifactId>
        <configuration>
            <descriptorRefs>
                <descriptorRef>jar-with-dependencies</descriptorRef>
            </descriptorRefs>
        </configuration>
    </plugin>
    
    #!/bin/sh
    USER_ARGS="-Dsomething=$1"
    COMPILATION_CLASSPATH=`find -L ./target -maxdepth 1 -name "*.jar" -type f -exec printf :{} ';'`
    JAVA_OPTS="-server -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms512M -Xmx2048M -XX:+HeapDumpOnOutOfMemoryError -XX:+AggressiveOpts -XX:+OptimizeStringConcat -XX:+UseFastAccessorMethods -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false ${JAVA_OPTS}"
    java $JAVA_OPTS $USER_ARGS -cp $COMPILATION_CLASSPATH io.gatling.app.Gatling -s your.simulation.FullClassName
    
    为了解释这一点,我以盖特林自己的发射脚本为灵感。主要注意类路径参数定义中存在target目录

    4) 编译编译后的目标目录并将launch.sh编译到单个目录,然后将其分发(例如,作为存档)。然后,您可以通过执行/launch.sh来查看场景


    我知道这不是一个标准的解决方案,但它对我有效。希望它也能帮助你。如果您有任何需要改进的问题或提示,请与我们分享。

    您始终可以创建一个简单的Java类,以Gatling.fromArgs启动Gatling。使用此设置,您可以在一个快乐的可执行jar中拥有所有内容。让这个类成为jarmain类,而不是“io.gatling.app.gatling”。此示例适用于scala模拟类“my.package.MySimulation”

    导入scala.Option;
    导入io.gatling.app.gatling;
    导入io.gatling.core.scenario.Simulation;
    公共类启动模拟{
    公共静态void main(字符串[]args){
    fromArgs(新字符串[]{},新选项(){
    私有静态最终长serialVersionUID=1L;
    @凌驾
    公共int生产率(){
    返回0;
    }
    @凌驾
    公共对象productElement(int arg0){
    返回null;
    }
    @抑制警告(“未选中”)
    @凌驾
    公共类get(){
    试一试{
    return(Class)Class.forName(“my.package.MySimulation”);
    }catch(classnotfounde异常){
    e、 printStackTrace();
    }
    返回null;
    }
    @凌驾
    公共布尔值为空(){
    返回false;
    }
    @凌驾
    公共布尔canEqual(对象o){
    返回false;
    }
    });
    }
    }
    
    我有一个类似的问题,我修复了它,如下所示:

    在Gatling包中有
    bin/
    ,请查看
    Gatling.sh
    。您可以看到,它只是将某些配置添加到类路径中,然后在
    gatling compiler-.jar
    中运行
    io.gatling.app.gatling
    类。所以,您所需要做的就是制作一个包含编译器的jar,向类路径添加配置和测试,并运行
    io.gatling.app.gatling
    。 步骤:

    添加编译器依赖项:

    <dependency>
            <groupId>io.gatling</groupId>
            <artifactId>gatling-compiler</artifactId>
            <version>${gatling.version}</version>
        </dependency
    

    我想这已经有点晚了,但我在这里面临着同样的问题,但我用的是maven,我用的是gradle。我猜方法是一样的,第一个解决方案和我自己的解决方案混合在一起

    首先,定义一个带有gatling依赖项的gradle构建文件和一个构建fatjar的任务

    apply plugin: 'scala'
    version 0.1
    
    dependencies {
      compile group: 'io.gatling', name: 'gatling-test-framework', version: '2.1.7'
      compile group: 'com.typesafe.akka', name: 'akka-actor_2.11', version: '2.4.7'
      compile group: 'org.scala-lang', name: 'scala-library', version: '2.11.7'
    }
    
    repositories{
       mavenCentral()
       mavenLocal()
    }
    
    
    task fatJar(type: Jar) {
       manifest {
           attributes 'Implementation-Title': 'Preparing test',  
              'Implementation-Version': version,
              'Main-Class': 'io.gatling.app.Gatling'
       }
       baseName = project.name + '-all'
          from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } {
            exclude 'META-INF/MANIFEST.MF'
            exclude 'META-INF/*.SF'
            exclude 'META-INF/*.DSA'
            exclude 'META-INF/*.RSA'
    
       }
       with jar
    }
    
    这项任务是按计划执行的

    gradle clean build fatJar
    
    将生成一个自包含的jar,该jar将默认运行Gatling主类。所以告诉它,您要运行的测试是使用标准的'-s'参数进行的

    所以最后一步是创建一个脚本来运行它。我将“窃取”第一条评论的脚本,并稍作修改

    #!/bin/sh
    
    if [ -z "$1" ];
    then
        echo "Test config tool"
        echo
        echo "Running Parameters : "
        echo
        echo " <Config file> : Test definition file. Required"
        echo
       exit 0;
     fi
    
    USER_ARGS="-DCONFIG_FILE=$1"
    JAVA_OPTS="-server -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms512M -Xmx2048M -XX:+HeapDumpOnOutOfMemoryError -XX:+AggressiveOpts -XX:+OptimizeStringConcat -XX:+UseFastAccessorMethods -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false ${JAVA_OPTS}"
    java $JAVA_OPTS $USER_ARGS -jar test-project-all-0.1.jar -s FunctionalTestSimulation -nr
    
    当你有时间的时候,我会提供一个到我的github的链接。
    干杯

    我使用IntelliJ Idea,我正确地解决了这个问题
    java -cp ".:application-test.jar:application.jar" io.gatling.app.Gatling  
    
    apply plugin: 'scala'
    version 0.1
    
    dependencies {
      compile group: 'io.gatling', name: 'gatling-test-framework', version: '2.1.7'
      compile group: 'com.typesafe.akka', name: 'akka-actor_2.11', version: '2.4.7'
      compile group: 'org.scala-lang', name: 'scala-library', version: '2.11.7'
    }
    
    repositories{
       mavenCentral()
       mavenLocal()
    }
    
    
    task fatJar(type: Jar) {
       manifest {
           attributes 'Implementation-Title': 'Preparing test',  
              'Implementation-Version': version,
              'Main-Class': 'io.gatling.app.Gatling'
       }
       baseName = project.name + '-all'
          from { configurations.compile.collect { it.isDirectory() ? it : zipTree(it) } } {
            exclude 'META-INF/MANIFEST.MF'
            exclude 'META-INF/*.SF'
            exclude 'META-INF/*.DSA'
            exclude 'META-INF/*.RSA'
    
       }
       with jar
    }
    
    gradle clean build fatJar
    
    #!/bin/sh
    
    if [ -z "$1" ];
    then
        echo "Test config tool"
        echo
        echo "Running Parameters : "
        echo
        echo " <Config file> : Test definition file. Required"
        echo
       exit 0;
     fi
    
    USER_ARGS="-DCONFIG_FILE=$1"
    JAVA_OPTS="-server -XX:+UseThreadPriorities -XX:ThreadPriorityPolicy=42 -Xms512M -Xmx2048M -XX:+HeapDumpOnOutOfMemoryError -XX:+AggressiveOpts -XX:+OptimizeStringConcat -XX:+UseFastAccessorMethods -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -Djava.net.preferIPv4Stack=true -Djava.net.preferIPv6Addresses=false ${JAVA_OPTS}"
    java $JAVA_OPTS $USER_ARGS -jar test-project-all-0.1.jar -s FunctionalTestSimulation -nr
    
    test-project
        |_ build.gradle
        |_ src
            |_ main
                |_ scala
                |_ resources
        |_ runSimulation.sh
        |_ configFile.conf
    
    <project>
        <!-- ... -->
        <dependencies>
            <dependency>
                <groupId>io.gatling.highcharts</groupId>
                <artifactId>gatling-charts-highcharts</artifactId>
                <version>${gatling.version}</version>
            </dependency>
        </dependencies>
    </project>
    
    <project>
        <!-- ... -->
        <build>
            <plugins>
                <plugin>
                  <groupId>org.apache.maven.plugins</groupId>
                  <artifactId>maven-shade-plugin</artifactId>
                  <version>3.1.1</version>
                  <configuration>
                    <filters>
                      <!-- https://stackoverflow.com/a/6743609 -->
                      <filter>
                        <artifact>*:*</artifact>
                        <excludes>
                          <exclude>META-INF/*.DSA</exclude>
                          <exclude>META-INF/*.SF</exclude>
                          <exclude>META-INF/*.RSA</exclude>
                        </excludes>
                      </filter>
                    </filters>
                  </configuration>
                  <executions>
                    <execution>
                      <phase>package</phase>
                      <goals>
                        <goal>shade</goal>
                      </goals>
                      <configuration>
                        <transformers>
                          <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                            <mainClass>io.gatling.app.Gatling</mainClass>
                          </transformer>
                        </transformers>
                      </configuration>
                    </execution>
                  </executions>
                </plugin>
            </plugins>
        </build>
    </project>