Java Neo4j-Lucene-maven shade插件通过Netbeans可以很好地工作,但不能作为jar工作

Java Neo4j-Lucene-maven shade插件通过Netbeans可以很好地工作,但不能作为jar工作,java,maven,netbeans,neo4j,lucene,Java,Maven,Netbeans,Neo4j,Lucene,我创建了一个maven java应用程序来执行一些neo4j查询。我有一个类,其中neo4j查询正在执行,还有一个类中我用Swing制作了一个gui,这样我就可以使用按钮执行查询并在文本区域中显示结果。如果我在Netbeans中运行这个项目,一切都很好,但是当我使用maven shade插件创建这个项目的胖jar时,发生了一些事情,neo4j命令不起作用。我认为问题出在lucenejars(来自apache文件夹和neo4j文件夹),所以我在pom.xml文件中使用了一些代码来修复它,但运气不好

我创建了一个maven java应用程序来执行一些neo4j查询。我有一个类,其中neo4j查询正在执行,还有一个类中我用Swing制作了一个gui,这样我就可以使用按钮执行查询并在文本区域中显示结果。如果我在Netbeans中运行这个项目,一切都很好,但是当我使用maven shade插件创建这个项目的胖jar时,发生了一些事情,neo4j命令不起作用。我认为问题出在lucenejars(来自apache文件夹和neo4j文件夹),所以我在pom.xml文件中使用了一些代码来修复它,但运气不好。问题可能是因为类路径中存在相同的类名冲突

myJFrame.java

package com.mycompany.neo4jqueries;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import java.util.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingWorker;

/**
 *
 * @author Dar309
 */
public class myJFrame extends JPanel {

    private JComboBox firstComboBox;
    private JTextArea queryTextArea, resultTextArea, infoTextArea;
    private String[] comboBoxItems, queryList;
    private JButton executeButton;
    private Font monosSpacedFont = new Font("monospaced", Font.PLAIN, 12);
    private JProgressBar progressBar;
    private Task myTask;
    private long miliBeforeExec = 0, miliAfterExec = 0, execTime = 0;

    public myJFrame() {
        super(new BorderLayout());

        JPanel firstPanel = new JPanel();
        BorderLayout fpL = new BorderLayout();
        firstPanel.setLayout(fpL);

        JPanel topPanel = new JPanel();
        topPanel.setLayout(new BorderLayout());

        JPanel topPanel1 = new JPanel();
        topPanel1.setLayout(new FlowLayout(FlowLayout.CENTER));

        comboBoxItems = new String[]{"1",
            "The Top 10 Stack Overflow Users",
            "The Top 5 tags That Jon Skeet Used in Asking Questions"};

        queryList = new String[]{"match (n) \nreturn head(labels(n)) as label, count(*)",
            "match (u:User) \nwith u,size( (u)-[:POSTED]->()) as posts order by posts desc limit 10 \nreturn u.name, posts",
            "match (u:User)-[:POSTED]->()-[:HAS_TAG]->(t:Tag) \nwhere u.name = 'Jon Skeet' \nreturn t,count(*) as posts order by posts desc limit 5"};

        firstComboBox = new JComboBox(comboBoxItems);

        firstComboBox.setSelectedIndex(0);
        firstComboBox.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                queryTextArea.setText(queryList[firstComboBox.getSelectedIndex()]);

            }
        });

        topPanel1.add(firstComboBox);

        JPanel topPanel2 = new JPanel();
        topPanel2.setLayout(new FlowLayout());

        queryTextArea = new JTextArea();
        queryTextArea.setText(queryList[0]);
        queryTextArea.setFont(monosSpacedFont);
        queryTextArea.setEditable(false);

        JScrollPane queryScrollPane = new JScrollPane(queryTextArea);
        queryScrollPane.setPreferredSize(new Dimension(450, 110));

        topPanel2.add(queryScrollPane);

        JPanel topPanel3 = new JPanel();
        topPanel3.setLayout(new FlowLayout());

        progressBar = new JProgressBar(0, 100);
        progressBar.setValue(0);
        progressBar.setString("No progress yet");
        progressBar.setStringPainted(true);

        executeButton = new JButton("Execute");
        executeButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                executeButton.setEnabled(false);
                progressBar.setIndeterminate(true);
                firstComboBox.setEnabled(false);
                progressBar.setString("Loading...");
                setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));

                miliBeforeExec = System.currentTimeMillis();

                //Instances of javax.swing.SwingWorker are not reusuable, so
                //we create new instances as needed.
                myTask = new Task();
                myTask.addPropertyChangeListener(new PropertyChangeListener() {
                    @Override
                    public void propertyChange(PropertyChangeEvent evt) {
                        if ("progress" == evt.getPropertyName()) {
//                            int progress = (Integer) evt.getNewValue();
//                            progressBar.setValue(progress);
                        }
                    }
                });
                myTask.execute();
            }
        });

        topPanel3.add(progressBar);
        topPanel3.add(executeButton);

        topPanel.add(topPanel1, BorderLayout.NORTH);
        topPanel.add(topPanel2, BorderLayout.CENTER);
        topPanel.add(topPanel3, BorderLayout.SOUTH);

        firstPanel.add(topPanel, BorderLayout.NORTH);

        JPanel resultPanel = new JPanel();
        resultPanel.setLayout(new BorderLayout());

        resultTextArea = new JTextArea();
        resultTextArea.setFont(monosSpacedFont);
        resultTextArea.setText("");
        resultTextArea.setEditable(false);

        JScrollPane centerScrollPane = new JScrollPane(resultTextArea);
        centerScrollPane.setPreferredSize(new Dimension(550, 200));
        centerScrollPane.setBorder(BorderFactory.createEmptyBorder(5, 0, 10, 0));
        resultPanel.add(centerScrollPane, BorderLayout.CENTER);

        infoTextArea = new JTextArea();
        infoTextArea.setRows(2);
        infoTextArea.setFont(monosSpacedFont);
        infoTextArea.setEditable(false);

        resultPanel.add(infoTextArea, BorderLayout.SOUTH);

        firstPanel.add(resultPanel, BorderLayout.CENTER);

        add(firstPanel, BorderLayout.CENTER);
        setBorder(BorderFactory.createEmptyBorder(20, 20, 20, 20));
    }

    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame();
//        frame.setSize(650, 550);
        frame.setSize(Toolkit.getDefaultToolkit().getScreenSize().width / 2,Toolkit.getDefaultToolkit().getScreenSize().height / 2);
        frame.setMinimumSize(new Dimension(frame.getWidth(), frame.getHeight()));
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setTitle("Execute your Neo4j queries");

        Dimension dimension = Toolkit.getDefaultToolkit().getScreenSize();
        int x = (int) ((dimension.getWidth() - frame.getWidth()) / 2);
        int y = (int) ((dimension.getHeight() - frame.getHeight()) / 2);
        frame.setLocation(x, y);

        //Create and set up the content pane.
        JComponent newContentPane = new myJFrame();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    class Task extends SwingWorker<Void, Void> {

        /*
         * Main task. Executed in background thread.
         */
        @Override
        public Void doInBackground() {
//            Random random = new Random();
//            int progress = 0;
            //Initialize progress property.
            setProgress(0);

            System.out.println("popo");
            resultTextArea.append("popo");
            myQuery mq = new myQuery();
            mq.run(myJFrame.this);
            resultTextArea.append("metaaaa");
            System.out.println("metaaa");

//            setProgress(Math.min(progress, 100));
            return null;
        }

        /*
         * Executed in event dispatching thread
         */
        @Override
        public void done() {
            Toolkit.getDefaultToolkit().beep();
            progressBar.setIndeterminate(false);
            executeButton.setEnabled(true);
            firstComboBox.setEnabled(true);
//            resultTextArea.setCaretPosition(resultTextArea.getText().length());
            setCursor(null); //turn off the wait cursor

            miliAfterExec = System.currentTimeMillis();
            execTime = miliAfterExec - miliBeforeExec;
//            execTime += 11140000;

            if (execTime < 60 * 1000) {
                infoTextArea.setText("Total time: " + (double) (execTime / 1000.000) + "s");
            }          
//            else if(execTime >= (60 * 1000) && execTime < (3600 * 1000) ){
            else if (execTime >= (60 * 1000)) {
                long temp = execTime;
                for (long i = 0; i < execTime / (60 * 1000); i++) {
                    temp -= (60 * 1000);
                }
                infoTextArea.setText("Total time: " + (execTime / (60 * 1000)) + ":" + (double) (temp / 1000.000) + "s");
            }
            Date date = new Date();
            infoTextArea.append("\nFinished at: " + date.toString());

            progressBar.setString("Done!");
        }
    }

    public static void main(String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                createAndShowGUI();
            }
        });
    }

    public JTextArea getResultTextArea() {
        return resultTextArea;
    }

    public JTextArea getQueryTextArea() {
        return queryTextArea;
    }

}
package com.mycompany.neo4jquerys;
导入java.awt.BorderLayout;
导入java.awt.Color;
导入java.awt.Cursor;
导入java.awt.Dimension;
导入java.awt.FlowLayout;
导入java.awt.Font;
导入java.awt.Toolkit;
导入java.awt.event.ActionEvent;
导入java.awt.event.ActionListener;
导入java.beans.PropertyChangeEvent;
导入java.beans.PropertyChangeListener;
导入java.util.Date;
导入java.util.logging.Level;
导入java.util.logging.Logger;
导入javax.swing.BorderFactory;
导入javax.swing.JButton;
导入javax.swing.JComboBox;
导入javax.swing.JComponent;
导入javax.swing.JFrame;
导入javax.swing.JPanel;
导入javax.swing.JProgressBar;
导入javax.swing.JScrollPane;
导入javax.swing.JTextArea;
导入javax.swing.SwingWorker;
/**
*
*@作者Dar309
*/
公共类myJFrame扩展了JPanel{
私有JComboBox firstComboBox;
私有JTextArea queryTextArea、resultTextArea、infoTextArea;
私有字符串[]comboBoxItems,queryList;
私有JButton executeButton;
私有字体monosSpacedFont=新字体(“单间距”,Font.PLAIN,12);
私人JProgressBar progressBar;
私有任务myTask;
private long miliBeforeExec=0,milibafterexec=0,execTime=0;
公共myJFrame(){
超级(新边框布局());
JPanel firstPanel=新的JPanel();
BorderLayout fpL=新的BorderLayout();
firstPanel.setLayout(fpL);
JPanel-topPanel=新的JPanel();
setLayout(新的BorderLayout());
JPanel topPanel1=新的JPanel();
topPanel1.setLayout(新的FlowLayout(FlowLayout.CENTER));
comboBoxItems=新字符串[]{“1”,
“前10名堆栈溢出用户”,
“Jon Skeet在提问时使用的前5个标签”};
queryList=新字符串[]{“匹配(n)\n返回头(标签(n))作为标签,计数(*)”,
“将(u:User)\n与u匹配,大小((u)-[:POSTED]->())为按posts排序的posts desc limit 10\n返回u.name,posts”,
“匹配(u:User)-[:POSTED]->()-[:HAS_TAG]->(t:TAG)\n此处u.name='Jon Skeet'\n返回t,按posts desc limit 5将(*)计数为posts order”;
firstComboBox=新的JComboBox(comboBoxItems);
firstComboBox.setSelectedIndex(0);
addActionListener(新ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
queryTextArea.setText(queryList[firstComboBox.getSelectedIndex()]);
}
});
topPanel1.add(第一个组合框);
JPanel topPanel2=新的JPanel();
setLayout(新的FlowLayout());
queryTextArea=新的JTextArea();
queryTextArea.setText(queryList[0]);
setFont(monosSpacedFont);
queryTextArea.setEditable(false);
JScrollPane queryScrollPane=新的JScrollPane(queryTextArea);
setPreferredSize(新维度(450110));
添加(queryScrollPane);
JPanel topPanel3=新的JPanel();
setLayout(新的FlowLayout());
progressBar=新的JProgressBar(01100);
progressBar.setValue(0);
progressBar.setString(“尚未取得进展”);
progressBar.SetStringPaint(真);
executeButton=新JButton(“执行”);
addActionListener(新建ActionListener()){
@凌驾
已执行的公共无效操作(操作事件e){
executeButton.setEnabled(false);
progressBar.SetUndeterminate(真);
firstComboBox.setEnabled(false);
progressBar.setString(“加载…”);
setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_Cursor));
miliBeforeExec=System.currentTimeMillis();
//javax.swing.SwingWorker的实例不可重用,因此
//我们根据需要创建新实例。
myTask=新任务();
myTask.addPropertyChangeListener(新的PropertyChangeListener(){
@凌驾
公共作废属性更改(属性更改事件evt){
if(“progress”==evt.getPropertyName()){
//int progress=(整数)evt.getNewValue();
//progressBar.setValue(进度);
}
}
});
myTask.execute();
}
});
topPanel3.添加(进度条);
添加(执行按钮);
topPanel.add(topPanel1,BorderLayout.NORTH);
添加(topPanel2,BorderLayout.CENTER);
topPanel.add(topPanel3,BorderLayout.SOUTH);
添加(topPanel,BorderLayout.NORTH);
JPanel resultPanel=新的JPanel();
resultPanel.setLayout(新的BorderLayout());
resultTextArea=新的JTextArea();
resultTextArea.setFont(monosSpacedFont);
resultTextArea.setText(“”);
resultTextArea.setEditable(false);
JScrollPane centerScrollPane=新的JScrollPane(resultTextArea);
centerScrollPane.setPreferredSize(新尺寸(550200));
centerScrollPane.setBorder(BorderFactory.CreateEmptyByOrder(5,0,10,0));
结果名称添加(百分位)
    /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.mycompany.neo4jqueries;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.swing.JFrame;

import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Result;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import org.neo4j.helpers.collection.Iterators;

/**
 *
 * @author Dar309
 */
public class myQuery {

    private static final File DB_PATH = new File("D:/IU/Διπλωματική/neo4j-community-3.1.2/data/databases/graph.db");
    String resultString;
    String columnsString;
    String nodeResult;
    String rows = "";


    void run(myJFrame myFrame) {
        GraphDatabaseService db = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);

        myFrame.getResultTextArea().append("sdadsdsadsads");
        System.out.println("naiiiii");
        try (Transaction ignored = db.beginTx();
//                Result result = db.execute("match (u:User) with u,size( (u)-[:POSTED]->()) as posts order by posts desc limit 10 return u.name, posts")) {
                Result result = db.execute(myFrame.getQueryTextArea().getText() ) ) {

            // START SNIPPET: columns
            List<String> columns = result.columns();
            // END SNIPPET: columns

            columnsString = columns.toString();
//            resultString = db.execute( "match (u:User) with u,size( (u)-[:POSTED]->()) as posts order by posts desc limit 10 return u.name, posts" ).resultAsString();
            resultString = result.resultAsString();
            System.out.println("\n\ncolumnsString\n------------------------------------------");
            System.out.println(columnsString);

            System.out.println("\n\nresultString\n------------------------------------------");
            System.out.println(resultString);
            myFrame.getResultTextArea().append(resultString);

            try {
                PrintWriter writer = new PrintWriter("the-file-name.txt", "UTF-8");
                writer.print(resultString);
                writer.close();
            } catch (IOException e) {
                // do something
            }
        }

        db.shutdown();
    }

}
    <?xml version="1.0" encoding="UTF-8"?>
<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>com.mycompany</groupId>
    <artifactId>Neo4jQueries</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.neo4j</groupId>
            <artifactId>neo4j</artifactId>
            <version>3.1.2</version>
        </dependency>
    </dependencies>
    <name>neo4jQueries</name>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                        <configuration>
                            <shadedArtifactAttached>true</shadedArtifactAttached>
                            <shadedClassifierName>shaded</shadedClassifierName>
                            <createDependencyReducedPom>false</createDependencyReducedPom>
                            <relocations>
                                <relocation>
                                    <pattern>org.apache.lucene</pattern>
                                    <shadedPattern>shaded_lucene_5_5_0.org.apache.lucene</shadedPattern>
                                </relocation>
                                <relocation>
                                    <pattern>org.neo4j</pattern>
                                    <shadedPattern>shaded_neo4j.org.neo4j</shadedPattern>
                                </relocation>
                            </relocations>
                            <transformers>
                                <transformer implementation="org.apache.maven.plugins.shade.resource.ManifestResourceTransformer">
                                    <mainClass>com.mycompany.neo4jqueries.myJFrame</mainClass>
                                </transformer>
                            </transformers>
                        </configuration>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>

    <repositories>
        <repository>
            <id>neo4j-repo</id>
            <name>Neo4j Repository</name>
            <url>http://m2.neo4j.org/content/repositories/releases</url>
        </repository>
    </repositories>

</project>