如何在Eclipse中导出到Runnable Jar时保持文件夹结构? [英] How to maintain folder structure while exporting to Runnable Jar in Eclipse?

查看:111
本文介绍了如何在Eclipse中导出到Runnable Jar时保持文件夹结构?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我试图在过去的一周内找到解​​决方案,并发布了一个相同的问题。

I am trying to find a solution for this from the past one week and have posted a question regarding the same.

我创建了一个简单的Maven项目。
并编写了一个开放浏览器的功能文件,转到Facebook并关闭浏览器。

I have created a simple Maven Project. And have written a feature file which is open browser, go to facebook and close the browser.

首先,下面是项目结构,

First of all, below is the project structure,

项目结构

以下是我的专题文件。功能文件的名称为 Testing.feature

Below is my feature file. Name of the feature file is Testing.feature

Feature: Open FB
Scenario: Open FB
    Given User opens "facebookURL" on "ChromeBr"
    When User is on facebook
    Then close the browser

然后我为上述特征文件编写了一个步骤定义。步骤定义文件的名称是 Testing.java

Then I wrote a stepdefinition for the above feature file. Name of the step definition file is Testing.java

package stepDefinitions;

import cucumber.api.java.en.Given;
import cucumber.api.java.en.Then;
import cucumber.api.java.en.When;
import util.WebConnector;

public class Testing {
    WebConnector wc = WebConnector.getInstance();
    @Given("^User opens \"([^\"]*)\" on \"([^\"]*)\"$")
    public void user_opens_on(String URL, String Browser) throws Throwable {
        wc.openBrowser(Browser);
        wc.navigateURL(URL);
        System.out.println("Browser Opened & navigated to FB");
    }


    @When("^User is on facebook$")
    public void user_is_on_facebook() throws Throwable {
        System.out.println("User is on FB");
    }

    @Then("^close the browser$")
    public void close_the_browser() throws Throwable {
        wc.quitBrowser();
        System.out.println("Browser Closed");
    }
}

并且config.properties只包含一个属性

And config.properties contains only one property

facebookURL=https://www.facebook.com

我写了一个公共类文件,它是 WebConnector.java ,它有一个用于初始化属性文件的构造函数和一些开放浏览器和URL等方法

I written a common class file which is WebConnector.java which will have a constructor for initializing the property file and few methods like open browser and URL etc

package util;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;
import java.util.concurrent.TimeUnit;

import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class WebConnector {
    public Properties OR = null;
    public Properties CONFIG = null;
    public static WebDriver driver;
    static WebConnector w;
    private WebConnector() {
        if(CONFIG==null) {
            try {
                CONFIG = new Properties();
                FileInputStream fis = new FileInputStream(System.getProperty("user.dir")+"\\src\\test\\java\\config\\config.properties"); **//Here only I get error when I export as Runnable Jar and Run**
                CONFIG.load(fis);
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }

    public static WebConnector getInstance() {
        if(w==null)
            w=new WebConnector();
            return w;
    }

    public void openBrowser(String browserName) throws IOException {
            System.setProperty("webdriver.chrome.driver", System.getProperty("user.dir")+"\\chromedriver.exe");
            driver = new ChromeDriver();
            driver.manage().window().maximize();
        driver.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
    }
    public void navigateURL(String URL) throws IOException {
        driver.get(CONFIG.getProperty(URL));
    }

    public void quitBrowser() {
        driver.quit();
    }
}

这是我的测试跑步者类,有一个主要的方法。它可以使用Junit以及Java应用程序运行

And this is my test runner class which has a main method. It can be run using Junit as well Java Application

package util;

import org.junit.runner.JUnitCore;
import org.junit.runner.RunWith;
import cucumber.api.CucumberOptions;
import cucumber.api.junit.Cucumber;

@RunWith(Cucumber.class)
@CucumberOptions(
        features = "classpath:feature",
        glue = "stepDefinitions"
        )

public class RunCukesTest {
    public static void main(String[] args) {                    
        JUnitCore.main("util.RunCukesTest");
    }
}

Pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>Jar_Testing</groupId>
  <artifactId>Jar_Testing</artifactId>
  <version>0.0.1-SNAPSHOT</version>


    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.seleniumhq.selenium/selenium-java -->
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>3.5.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/junit/junit -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
        <!-- https://mvnrepository.com/artifact/info.cukes/cucumber-java -->
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-java</artifactId>
            <version>1.2.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/info.cukes/cucumber-core -->
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-core</artifactId>
            <version>1.2.5</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/info.cukes/cucumber-junit -->
        <dependency>
            <groupId>info.cukes</groupId>
            <artifactId>cucumber-junit</artifactId>
            <version>1.2.5</version>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
            <plugins>
                <plugin>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <configuration>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                        <archive>
                            <manifest>
                                <mainClass>util.RunCukesTest</mainClass>
                            </manifest>
                        </archive>
                    </configuration>
                </plugin>
            </plugins>
    </build>

</project>

问题:
当我使用Junit或Java Application运行RunCukesTest.java时,它会运行完美。也就是说,它打开浏览器,转到fb并关闭浏览器。

Problem: When I run RunCukesTest.java, using Junit or Java Application, it runs perfectly. That is, it opens the browser, goes to fb and closes the browser.

但是当我创建一个可执行的Jar并运行时,它没有按预期运行。

But when I create an executable Jar and run, it does not run as expected.

我按照以下步骤导出为Runnable Jar:

I export as Runnable Jar by following below Steps:

1) Run--> Run Configuration--> Java Application-->New Launch Configuration-->And selects the main class as RunCukesTest.java-->Apply
2) Right click the project-->Export
3) Java--> Runnable JAR File -->Next
4) Under Launch Configuration select the RunCukesTest.java and give the export destination
5) And I have selected the option "Extract required Libraries into Jar"
5) click finish

假设我已将此Jar保存在我的桌面上。桌面路径 - >C:\ Users \ PC\Desktop
当我从命令提示符运行此Jar时,它显示以下

Say I have saved this Jar in My desktop. desktop path-->"C:\Users\PC\Desktop" When I run this Jar from command prompt, it shows the below

C:\Users\PC\Downloads>java -jar Maven.jar
JUnit version 4.12
.java.io.FileNotFoundException: C:\Users\PC\Downloads\src\test\java\config\c
onfig.properties (The system cannot find the path specified)
        at java.io.FileInputStream.open0(Native Method)
        at java.io.FileInputStream.open(FileInputStream.java:195)
        at java.io.FileInputStream.<init>(FileInputStream.java:138)
        at java.io.FileInputStream.<init>(FileInputStream.java:93)
        at util.WebConnector.<init>(WebConnector.java:19)
        at util.WebConnector.getInstance(WebConnector.java:30)
        at stepDefinitions.Testing.<init>(Testing.java:9)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstruct
orAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingC
onstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at cucumber.runtime.java.DefaultJavaObjectFactory.cacheNewInstance(Defau
ltJavaObjectFactory.java:41)
        at cucumber.runtime.java.DefaultJavaObjectFactory.getInstance(DefaultJav
aObjectFactory.java:33)
        at cucumber.runtime.java.JavaStepDefinition.execute(JavaStepDefinition.j
ava:38)
        at cucumber.runtime.StepDefinitionMatch.runStep(StepDefinitionMatch.java
:37)
        at cucumber.runtime.Runtime.runStep(Runtime.java:300)
        at cucumber.runtime.model.StepContainer.runStep(StepContainer.java:44)
        at cucumber.runtime.model.StepContainer.runSteps(StepContainer.java:39)
        at cucumber.runtime.model.CucumberScenario.run(CucumberScenario.java:44)

        at cucumber.runtime.junit.ExecutionUnitRunner.run(ExecutionUnitRunner.ja
va:102)
        at cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:63)
        at cucumber.runtime.junit.FeatureRunner.runChild(FeatureRunner.java:18)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at cucumber.runtime.junit.FeatureRunner.run(FeatureRunner.java:70)
        at cucumber.api.junit.Cucumber.runChild(Cucumber.java:95)
        at cucumber.api.junit.Cucumber.runChild(Cucumber.java:38)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at cucumber.api.junit.Cucumber.run(Cucumber.java:100)
        at org.junit.runners.Suite.runChild(Suite.java:128)
        at org.junit.runners.Suite.runChild(Suite.java:27)
        at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
        at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
        at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
        at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
        at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
        at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
        at org.junit.runner.JUnitCore.run(JUnitCore.java:115)
        at org.junit.runner.JUnitCore.runMain(JUnitCore.java:77)
        at org.junit.runner.JUnitCore.main(JUnitCore.java:36)
        at util.RunCukesTest.main(RunCukesTest.java:16)
.EEII
←[31mFailed scenarios:←[0m
←[31mfeature/Testing.feature:3 ←[0m# Scenario: Open FB

1 Scenarios (←[31m1 failed←[0m)
3 Steps (←[31m1 failed←[0m, ←[36m2 skipped←[0m)
0m0.314s

java.lang.IllegalStateException: The driver executable does not exist: C:\Users\
PC\Downloads\chromedriver.exe
        at com.google.common.base.Preconditions.checkState(Preconditions.java:53
4)
        at org.openqa.selenium.remote.service.DriverService.checkExecutable(Driv
erService.java:136)
        at org.openqa.selenium.remote.service.DriverService.findExecutable(Drive
rService.java:131)
        at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDrive
rService.java:32)
        at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExe
cutable(ChromeDriverService.java:137)
        at org.openqa.selenium.remote.service.DriverService$Builder.build(Driver
Service.java:329)
        at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(C
hromeDriverService.java:88)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:124)

        at util.WebConnector.openBrowser(WebConnector.java:36)
        at stepDefinitions.Testing.user_opens_on(Testing.java:12)
        at ?.Given User opens "facebookURL" on "ChromeBr"(feature/Testing.featur
e:4)


Time: 0.359
There were 2 failures:
1) Given User opens "facebookURL" on "ChromeBr"(Scenario: Open FB)
java.lang.IllegalStateException: The driver executable does not exist: C:\Users\
PC\Downloads\chromedriver.exe
        at com.google.common.base.Preconditions.checkState(Preconditions.java:53
4)
        at org.openqa.selenium.remote.service.DriverService.checkExecutable(Driv
erService.java:136)
        at org.openqa.selenium.remote.service.DriverService.findExecutable(Drive
rService.java:131)
        at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDrive
rService.java:32)
        at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExe
cutable(ChromeDriverService.java:137)
        at org.openqa.selenium.remote.service.DriverService$Builder.build(Driver
Service.java:329)
        at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(C
hromeDriverService.java:88)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:124)

        at util.WebConnector.openBrowser(WebConnector.java:36)
        at stepDefinitions.Testing.user_opens_on(Testing.java:12)
        at ?.Given User opens "facebookURL" on "ChromeBr"(feature/Testing.featur
e:4)
2) Scenario: Open FB
java.lang.IllegalStateException: The driver executable does not exist: C:\Users\
PC\Downloads\chromedriver.exe
        at com.google.common.base.Preconditions.checkState(Preconditions.java:53
4)
        at org.openqa.selenium.remote.service.DriverService.checkExecutable(Driv
erService.java:136)
        at org.openqa.selenium.remote.service.DriverService.findExecutable(Drive
rService.java:131)
        at org.openqa.selenium.chrome.ChromeDriverService.access$000(ChromeDrive
rService.java:32)
        at org.openqa.selenium.chrome.ChromeDriverService$Builder.findDefaultExe
cutable(ChromeDriverService.java:137)
        at org.openqa.selenium.remote.service.DriverService$Builder.build(Driver
Service.java:329)
        at org.openqa.selenium.chrome.ChromeDriverService.createDefaultService(C
hromeDriverService.java:88)
        at org.openqa.selenium.chrome.ChromeDriver.<init>(ChromeDriver.java:124)

        at util.WebConnector.openBrowser(WebConnector.java:36)
        at stepDefinitions.Testing.user_opens_on(Testing.java:12)
        at ?.Given User opens "facebookURL" on "ChromeBr"(feature/Testing.featur
e:4)

FAILURES!!!
Tests run: 2,  Failures: 2

我知道它正试图找到文件,它失败了。当我打开Jar时,它在下面的结构中。

I understand that it is trying to find the file and it is failing. When I open Jar, it is in the below structure.

导出后的Jar结构

如何保持相同的文件夹结构,以便我找不到文件未找到异常或是否存在还有其他任何方法可以成功运行吗?

How do I maintain the same folder structure so that I don't get File Not Found Exception or Is there any other way to run this successfully?

推荐答案

我们无法保持项目的相同结构。最好的解决方案,我发现,当从任何其他路径运行可执行jar时,我确保那些文件夹(不是jar的一部分,但是项目的一部分)存在于我的可执行jar的相同路径中。

We cannot maintain the same structure of the project. Best solution, I have found is, while running executable jar from anyother path, I made sure that those folders(which are not part of jar but a part of project) exists in the same path where my executable jar is.

这篇关于如何在Eclipse中导出到Runnable Jar时保持文件夹结构?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆